【题目】 分别实现反转单向链表和反转双向链表的函数。
【要求】 如果链表长度为N,时间复杂度要求为O(N),额外空间 复杂度要求为**O(1)
代码:
package basic_class_03;
/**
* 类名:Code_07_ReverseList<br>
* 功能:反转列表<br>
* 作者:java战士<br>
* 日期:2019/8/24<br>
* 版本:v1.0.0
* 历史修订:
*/
public class Code_07_ReverseList {
//单链表反转
public static class Node{
private int value;
private Node next;
public Node(int value) {
this.value = value;
}
}
public static 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;
}
public static class DoubleNode{
private int value;
private DoubleNode next;
private DoubleNode last;
public DoubleNode(int value) {
this.value = value;
}
}
public static DoubleNode reverseDoubleLinkList(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;
}
public static void printLinkedList(Node head){
System.out.print("LinkedList:");
while (head!=null){
System.out.print(head.value+" ");
head=head.next;
}
System.out.println();
}
public static void printDoubleLinkList(DoubleNode head){
System.out.print("DoubleLinkList:");
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.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);
System.out.println("=======================");
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;
printDoubleLinkList(head2);
head2=reverseDoubleLinkList(head2);
printDoubleLinkList(head2);
}
}
测试结果: