【LeetCode92】Reverse Linked List II★★

题目描述:

解题思路:

  题目大意:给定一个链表,反转第m到第n个结点部分,m、n满足1 ≤ m ≤ n ≤ length of list。

  解题思路参照LeetCode206题,用迭代法,不过要注意以下几点:

  (a):为方便操作,新建一个辅助结点dummy,使其下一个结点指向头节点。

  (b):维护4个指针:pre、current、then、then_next,pre指向第m个结点的前一个结点,current指向当前操作的位于区间[m,n]的结点,then指向current的下一个结点,then_next指向then的下一个结点。

  注意:这里的current、then、then_next就相当于LeetCode206题中的pre、current、next!

  初始化状态如下:

  dummy.next=head;

  pre=dummy;

  current=null,then=null,then_next=null。

  下面以链表1->2->3->4->5,m=2,n=4举例:

   (1)初始状态:

  

  (2)遍历到m位置时:

  (3)一次迭代操作后:

  (4)迭代最终位置:

 

 

     (5)执行①pre.next.next=then;②pre.next=current; 后:

Java代码:

 

 1 //public class LeetCode92为测试
 2 public class LeetCode92 {
 3     public static void main(String[] args) {
 4         ListNode n1=new ListNode(1),n2=new ListNode(2),n3=new ListNode(3),n4=new ListNode(4),n5=new ListNode(5);
 5         n1.next=n2;
 6         n2.next=n3;
 7         n3.next=n4;
 8         n4.next=n5;
 9         System.out.println("原来链表:"+n1.val+"->"+n2.val+"->"+n3.val+"->"+n4.val+"->"+n5.val);
10         ListNode n=new Solution().reverseBetween(n1,2,4);
11         System.out.println("反转链表:"+n.val+"->"+n.next.val+"->"+n.next.next.val+"->"+n.next.next.next.val+"->"+n.next.next.next.next.val);
12     }
13 }
14 class Solution {
15 public ListNode reverseBetween(ListNode head, int m, int n) {
16         ListNode dummy=new ListNode(0);
17         dummy.next=head;
18         ListNode pre=dummy;
19         ListNode current=head;
20         for(int i=1;i<=m-1;i++){
21             pre=current;
22             current=current.next;
23         }
24         ListNode then=null,then_next=null;
25         if(current!=null)
26             then=current.next;
27         if(then!=null)
28             then_next=then.next;
29         for(int j=m;j<n;j++){
30             then.next=current;
31             current=then;
32             then=then_next;
33             if(then_next!=null)
34                 then_next=then_next.next;
35         }
36         pre.next.next=then;
37         pre.next=current;
38         return dummy.next;
39     }
40 }
41 class ListNode {
42     int val;
43     ListNode next;
44     ListNode(int x) { val = x; }
45     }

程序结果:

 

posted @ 2017-02-28 23:30  追梦boy  阅读(364)  评论(0编辑  收藏  举报