这是一个常见的考验 Coding 能力的笔试题。
主要思路就是:
对于每个节点,使用临时变量记录原来的前驱和原来的后继,然后把原来的前驱接到这个节点的后继上。
代码如下:
public class ReverseList {
public static class Node {
public int value;
public Node next;
public Node(int data) {
this.value = data;
}
}
//单向链表反转
public static Node reverseList(Node head) {
//记录原前驱
Node pre = null;
//记录原后继的辅助变量
Node next;
while (head != null){
//记录原后继
next = head.next;
//反转
head.next = pre;
//刷新前驱
pre = head;
//刷新当前节点
head = next;
}
//运行到最后pre是新的头
return pre;
}
public static class DoubleNode {
public int value;
//前驱
public DoubleNode pre;
//后继
public DoubleNode next;
public DoubleNode(int data) {
this.value = data;
}
}
//双向链表反转
public static DoubleNode reverseList(DoubleNode head) {
//记录原前驱
DoubleNode pre = null;
//记录原后继的变量
DoubleNode next;
while (head != null){
//记录原后继
next = head.next;
//反转
head.next = pre;
head.pre = next;
//刷新前驱
pre = head;
//刷新当前节点
head = next;
}
//运行到最后pre是新的头
return pre;
}
public static void printLinkedList(Node head) {
System.out.print("Linked List: ");
while (head != null) {
System.out.print(head.value + " ");
head = head.next;
}
System.out.println();
}
public static void printDoubleLinkedList(DoubleNode head) {
System.out.print("Double Linked List: ");
DoubleNode end = null;
while (head != null) {
System.out.print(head.value + " ");
end = head;
head = head.next;
}
System.out.print("| ");
while (end != null) {
System.out.print(end.value + " ");
end = end.pre;
}
System.out.println();
}
public static void main(String[] args) {
Node head1 = new Node(1);
head1.next = new Node(2);
head1.next.next = new Node(3);
printLinkedList(head1);
head1 = reverseList(head1);
printLinkedList(head1);
DoubleNode head2 = new DoubleNode(1);
head2.next = new DoubleNode(2);
head2.next.pre = head2;
head2.next.next = new DoubleNode(3);
head2.next.next.pre = head2.next;
head2.next.next.next = new DoubleNode(4);
head2.next.next.next.pre = head2.next.next;
printDoubleLinkedList(head2);
printDoubleLinkedList(reverseList(head2));
}
}
运行结果: