问题描述:
反转单向链表和双向链表。
算法实现:
1.单链表反转
public class Node {
public int value;
public Node next;
public Node(int value) {
this.value = value;
}
}
public Node reverseList(Node head) {
Node pre = null;
Node next = null;
while (head != null) {
next = head.next;
head.next = pre;
pre = head;
head = next;
}
return pre;
}
2.双链表反转
public class DoubleNode {
public int value;
public DoubleNode last;
public DoubleNode next;
public DoubleNode(int value) {
this.value = value;
}
}
public DoubleNode reverseList(DoubleNode head) {
DoubleNode pre = null;
DoubleNode next = null;
while (head != null) {
next = head.next;
head.next = pre;
head.last = next;//注意区别
pre = head;
head = next;
}
return pre;
}
算法解析:
1.单链表反转
(1)单链表的反转,用两个额外的Node变量,一个用于临时保存Head结点的下一个结点,一个用作反转后的链表的头结点;
(2)需要注意的是,如何断,如何标示未被逆转的链表,如何生成逆转后的链表的头结点并不断的增加元素。
2.双链表反转
双链表反转区别与单链表主要是在于要为当前结点设置“前驱结点”,而当前结点的后一个结点在反转的时候将成为其前驱结点。