leetcode 92 反转链表区间

题目:

给定一个链表和需要反转的区间上下界,用one-pass完成反转操作。

 

思路:

1. 定位 2. 反转 3.链接

 

 1 class Solution {
 2     public ListNode reverseBetween(ListNode head, int m, int n) {
 3         ListNode pre = null;
 4         ListNode cur = head;
 5         
 6         //定位
 7         int start = 1;
 8         while (cur != null && start < m) {
 9             pre = cur;
10             cur = cur.next;
11             start++;
12         }
13         
14         //反转
15         ListNode pre2 = cur;
16         ListNode cur2 = null;
17         if (cur != null) {
18             cur2 = cur.next;
19             start++;
20         }
21         ListNode tmp = null;
22         while (cur2 != null && start <= n) {
23             tmp = cur2;
24             cur2 = cur2.next;
25             tmp.next = pre2;
26             pre2 = tmp;
27             start++;
28         }
29         
30         //链接
31         if (pre != null) {
32             pre.next = pre2;  
33         }
34         if (cur != null) {
35             cur.next = cur2;
36         }
37         
38         return pre == null ?  pre2 : head;
39     }
40 }

 

实现上尽管已经将能做的做到极致了,各种判断null和记录next node。但倒在了最后的return上。

第一次是忘了写return(又犯了老毛病),加了 return head; 后测试发现还是有问题。问题在于如果区间m是从1开始的,则新的链表头并不在head处,而是在pre2处。

 

然后逛讨论区的时候发现了一个巨强的写法,甘拜下风。

posted @ 2019-04-12 13:55  末夏始秋  阅读(218)  评论(0编辑  收藏  举报