【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 }
程序结果: