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处。
然后逛讨论区的时候发现了一个巨强的写法,甘拜下风。