标签:一个 ram var leetcode 部分 链表 javascrip 参考 div
反转链表二。也是不会做,会写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 -> 5guard 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
标签:一个 ram var leetcode 部分 链表 javascrip 参考 div
原文地址:https://www.cnblogs.com/aaronliu1991/p/11802898.html