题目 分别实现反转单向链表和反转双向链表的函数。
要求 如果链表长度为N,时间复杂度要求为O(N),额外空间 复杂度要求为O(1).
思路 设置两个指针分别指向当前节点的前一个结点和后一个节点,且初始位置为头节点前面的一个空节点。利用2个指针对节点的next方向进行改变。
package algorithm.section4;
public class ReverseList {
public static class Node{
private int value;
private Node next;
public Node(int value){
this.value = value;
}
}
public static Node reverseList(Node head){
if (head == null) return null;
else {
Node p = null;
Node q = null;
while (head != null){
q = head.next;
head.next = p;
p = head;
head = q;
}
return p;
}
}
public static class DoubleNode{
private int value;
private DoubleNode last;
private DoubleNode next;
public DoubleNode(int value){
this.value = value;
}
}
public static DoubleNode reverseList(DoubleNode head){
if (head == null) return null;
else {
DoubleNode p = null;
DoubleNode q = null;
while (head != null){
q = head.next;
head.next = p;
head.last = q;
p = head;
head = q;
}
return p;
}
}
public static void printLinkedList(Node head){
while (head != null){
System.out.print(head.value + " ");
head = head.next;
}
System.out.println();
}
public static void printDoubleLinkedList(DoubleNode head){
DoubleNode flag = null;
while (head != null){
System.out.print(head.value + " ");
flag = head;
head = head.next;
}
System.out.print("/");
while (flag != null){
System.out.print(flag.value + " ");
flag = flag.last;
}
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.last = head2;
head2.next.next = new DoubleNode(3);
head2.next.next.last = head2.next;
head2.next.next.next = new DoubleNode(4);
head2.next.next.next.last = head2.next.next;
printDoubleLinkedList(head2);
printDoubleLinkedList(reverseList(head2));
}
}