0 相关类
public class Link {class NewNode {public int value;public NewNode next;public NewNode rand;public NewNode(int value, NewNode next, NewNode rand) {this.value = value;this.next = next;this.rand = rand;}public NewNode(int value) {this.value = value;}}class Node {public int value;public Node next;public Node(int value) {this.value = value;}}class DoubleNode{public int value;public DoubleNode pre;public DoubleNode next;public DoubleNode(int value) {this.value = value;}}public Node head;public DoubleNode dhead;public void add(int vlaue) {Node node = new Node(vlaue);if (head == null) {head = node;} else {node.next = head;head = node;}}public void addDoubleNode(int vlaue) {DoubleNode node = new DoubleNode(vlaue);if (dhead == null) {dhead = node;} else {node.next = dhead;dhead.pre =node;dhead = node;}}// TODO Auto-generated method stubpublic static void printLink(Node head) {System.out.println();while (head != null) {System.out.print(head.value + " ");head = head.next;}}public static void printDLink(DoubleNode head2) {// TODO Auto-generated method stubSystem.out.println();while (head2 != null) {System.out.print(head2.value + " ");head2 = head2.next;}}
一 打印两个有序链表的公共部分
给定两个有序链表的头指针head1和head2,打印两个链表的公共部分
要打印两个有序链表的公共部分,可以使用双指针的方法进行比较。
具体实现如下:
public void printCommonPart(Node head1, Node head2) {System.out.println("Common Part:");while (head1 != null && head2 != null) {if (head1.value < head2.value) {head1 = head1.next;} else if (head1.value > head2.value) {head2 = head2.next;} else {System.out.println(head1.value + " "); // 打印公共节点head1 = head1.next;head2 = head2.next;}}System.out.println();
}
这个方法首先打印出"Common Part:"作为提示信息。
然后使用两个指针 `head1` 和 `head2` 分别指向两个链表的头节点。
在循环中,比较 `head1.value` 和 `head2.value` 的大小关系:
- 如果 `head1.value` 小于 `head2.value`,则移动 `head1` 指针到下一个节点,因为在有序链表中,较小的值一定不会和另一个链表中的值匹配。
- 如果 `head1.value` 大于 `head2.value`,则移动 `head2` 指针到下一个节点,同样因为有序链表中较小的值不会与另一个链表中的值匹配。
- 如果 `head1.value` 等于 `head2.value`,则打印这个公共节点的值,并将两个指针同时移动到各自的下一个节点。
最后,打印一个空行表示结束。
二 在单链表和双链表中删除倒数第K个节点
【题目】分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点。
【要求】如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1)。
public void printLink(Node head) {System.out.println();while (head != null) {System.out.print(head.value + " ");head = head.next;}
}public void printDLink(DoubleNode head) {System.out.println();while (head != null) {System.out.print(head.value + " ");head = head.next;}
}public static void main(String[] args) {Chapter2_2 chapter = new Chapter2_2();Link link1 = new Link(); // 单链表Link link2 = new Link(); // 双链表// 构造链表for (int i = 10; i > 0; i--) {link1.add(i);link2.addDoubleNode(i);}chapter.printLink(link1.head); // 打印单链表Node head = chapter.removeKNode(link1.head, 6); // 删除倒数第6个节点chapter.printLink(head); // 打印删除后的单链表chapter.printDLink(link2.dhead); // 打印双链表DoubleNode dhead = chapter.removeKDoubleNode(link2.dhead, 6); // 删除倒数第6个节点chapter.printDLink(dhead); // 打印删除后的双链表
}// 删除双链表中倒数第K个节点
private DoubleNode removeKDoubleNode(DoubleNode head, int k) {if (head == null || k < 1) {return null;}DoubleNode cur = head;while (cur != null) {k--;cur = cur.next;}// 此时k==0,说明原始K等于链表长度;if (k == 0) {head = head.next;head.pre = null; // 将新的头节点的pre设置为nullreturn head;}if (k < 0) {cur = head;while (++k != 0) {cur = cur.next;}DoubleNode newNode = cur.next.next;cur.next = newNode;if (newNode != null) {newNode.pre = cur;}}return head;
}// 删除单链表中倒数第K个节点
private Node removeKNode(Node head, int k) {if (head == null || k < 1) {return null;}Node cur = head;while (cur != null) {k--;cur = cur.next;}if (k == 0) {head = head.next;}if (k < 0) {cur = head;while (++k != 0) {cur = cur.next;}cur.next = cur.next.next;}return head;
}