您的位置:首页 > 编程语言 > Go语言

Reverse Linked List II

2014-01-31 05:34 337 查看


Reverse Linked List II

 Total Accepted: 4937 Total
Submissions: 19604My Submissions

Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:

Given 
1->2->3->4->5->NULL
, m = 2 and n =
4,
return 
1->4->3->2->5->NULL
.
Note:

Given m, n satisfy the following condition:

1 ≤ m ≤ n ≤ length of list.

Discuss

首先找到m的node. 同时要记录他的前一个node (pre)
reverse list 从 m 开始的list, 递归的次数是 count = n-m+1, 也就是说把 m~n 这段list reverse. 同时,要连接reverse的最后一个node 和 n+1节点
reverse 返回的是 reverse list 的开始,需要把开始节点和 m-1 和 m 节点来接起来,这里,如果pre == null, 说明我们是从整个list的头开始reverse n-m+1 次的, 所以直接返回 start即可。

public static ListNode reverseBetween(ListNode head, int m, int n) {
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode temp = dummy;
int count = n - m +1, i = 1;
while (i < m) {
temp = temp.next;
i++;
}
ListNode reverseStart = reverse(temp.next,null,temp.next,count);
temp.next = reverseStart;
head = dummy.next;
dummy.next = null;
return head;
}

private static ListNode reverse(ListNode head, ListNode pre, ListNode start, int k) {
if (k == 0) {
start.next = head;
return pre;
}
ListNode temp = head.next;
head.next = pre;
return reverse(temp, head, start, k - 1);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  algorithm leetcode