[LeetCode] 92. Reverse Linked List II

Posted aaronliu1991

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[LeetCode] 92. Reverse Linked List II相关的知识,希望对你有一定的参考价值。

反转链表二。也是不会做,会写homebrew也枉然的题目,但是非常容易错。题意是给一个链表和两个数字m和n,请反转m和n之间的node,只能走一次。例子,

Example:

Input: 1->2->3->4->5->NULL, m = 2, n = 4
Output: 1->4->3->2->5->NULL

这题我借助了一个图,非得看着图做才行。

/*
 1       ->     2    ->    3     ->  4  ->  5
guard          p          next
*/

思路是头插法。我参考了一个很好的图示。照着例子跑一下吧。假设需要反转的部分是从2到4,反转的顺序是先把3拿出来插入1和2中间,然后再把4插入1和3中间,像这样。guard永远是需要反转的部分之前的一个节点,像个守卫一样不能动p是需要反转的部分的第一个节点。

1  ->  2  ->  3  ->  4  ->  5

1  ->  3  ->  2  ->  4  ->  5

1  ->  4  ->  3  ->  2  ->  5

时间O(n)

空间O(1)

javascript实现

 1 /**
 2  * @param {ListNode} head
 3  * @param {number} m
 4  * @param {number} n
 5  * @return {ListNode}
 6  */
 7 var reverseBetween = function(head, m, n) {
 8     let dummy = new ListNode(0);
 9     dummy.next = head;
10     let pre = dummy;
11     let cur = dummy.next;
12     for (let i = 1; i < m; i++) {
13         cur = cur.next;
14         pre = pre.next;
15     }
16     for (let i = 0; i < n - m; i++) {
17         let temp = cur.next;
18         cur.next = temp.next;
19         temp.next = pre.next;
20         pre.next = temp;
21     }
22     return dummy.next;
23 };

 

Java实现

 1 class Solution {
 2     public ListNode reverseBetween(ListNode head, int m, int n) {
 3         ListNode dummy = new ListNode(0);
 4         dummy.next = head;
 5         ListNode guard = dummy;
 6         ListNode p = dummy.next;
 7 
 8         // move p to m
 9         int step = 0;
10         while (step < m - 1) {
11             guard = guard.next;
12             p = p.next;
13             step++;
14         }
15 
16         for (int i = 0; i < n - m; i++) {
17             ListNode removed = p.next;
18             p.next = p.next.next;
19             removed.next = guard.next;
20             guard.next = removed;
21         }
22         return dummy.next;
23     }
24 }

 

以上是关于[LeetCode] 92. Reverse Linked List II的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode92]Reverse Linked List II

#Leetcode# 92. Reverse Linked List II

Leetcode 92. Reverse Linked List II

leetcode.92. Reverse Linked List II

[LeetCode]92. Reverse Linked List II

LeetCode 92. Reverse Linked List II