链表--反转单向和双向链表
反转单向链表
要求:如果链表长度为N, 时间复杂度要求为O(N), 额外空间复杂度要求为O(1)
需要有一个前向指针,和一个后向指针,分别指向当前节点反转之后的next结点,和当前节点当前的next结点
public static ListNode reverse(ListNode head){ if(head == null) return null; ListNode preNode = null; while(head != null){ ListNode nextNode = head.next; head.next = preNode; preNode = head; head = nextNode; } return preNode; }
反转双向链表
解:准备两个结点preNode和nextNode,
用nextNode记录当前结点的next
然后当前结点的next指向preNode
当前结点的pre指向nextNode
preNode指向当前结点
当前结点再指向nextNode
public static DoubleNode reverseDoubleNode(DoubleNode head){ if(head == null) return null; DoubleNode preNode = null; while(head != null){ DoubleNode nextNode = head.next; head.next = preNode; head.pre = nextNode; preNode = head; head = nextNode; } return preNode; }
最终代码
package LinkQ; /** * Created by Skye on 2018/4/8. */ public class ReverseLinkedList { //单向链表 public static class ListNode{ public int val; public ListNode next = null; public ListNode(int val) { this.val = val; } } public static ListNode reverse(ListNode head){ if(head == null) return null; ListNode preNode = null; while(head != null){ ListNode nextNode = head.next; head.next = preNode; preNode = head; head = nextNode; } return preNode; } public static void print(ListNode head){ ListNode n = head; while(n != null){ System.out.print(n.val + " "); n = n.next; } System.out.println(); } //双向链表 public static class DoubleNode{ public int val; public DoubleNode pre = null; public DoubleNode next = null; public DoubleNode(int val){ this.val = val; } } public static DoubleNode reverseDoubleNode(DoubleNode head){ if(head == null) return null; DoubleNode preNode = null; while(head != null){ DoubleNode nextNode = head.next; head.next = preNode; head.pre = nextNode; preNode = head; head = nextNode; } return preNode; } public static void print(DoubleNode head){ DoubleNode end = null; while(head != null){ System.out.print(head.val + " "); end = head; head = head.next; } System.out.println(); while(end != null){ System.out.print(end.val + " "); end = end.pre; } System.out.println(); } public static void main(String[] args){ ListNode node = new ListNode(0); ListNode head = node; for(int i = 1; i < 10; i++){ node.next = new ListNode(i); node = node.next; } node.next = null; print(head); print(reverse( head )); DoubleNode node1 = new DoubleNode( 0 ); node1.pre = null; DoubleNode head1 = node1; for(int i = 1; i < 10; i++){ node1.next = new DoubleNode( i ); DoubleNode preNode = node1; node1 = node1.next; node1.pre = preNode; } node1.next = null; print(head1); print(reverseDoubleNode(head1)); } }