您的位置:首页 > 编程语言 > Java开发

【leetcode】Reverse Linked List II (Java)

2015-11-27 00:00 246 查看

Reverse Linked List II

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.
题意大致是把一部分链表反转一下。这道题我竟然自己做出来了,撒花撒花~~~(但是不确定是否满足限制条件

解题思路:

我觉得这道题对我来说主要的问题在于在不断地变化next时,如何去保证不会丢失节点;还有就是in-place和in one-pass的限制。这道题画图做比较方便。先上代码(虽然效率还是不高):

/**
* Definition for singly-linked list.
* public class ListNode {
*     int val;
*     ListNode next;
*     ListNode(int x) { val = x; }
* }
*/
public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
int index = 1;
if(m == 1){
ListNode root = new ListNode(0);
root.next = head;
m = 2;
n++;
ListNode start = root;
ListNode end = root;
while(index<m-1){
start = end = start.next;
index++;
}
end = end.next;
while(index<n-1){
ListNode temp = start.next;
start.next = end.next;
end.next = end.next.next;
start.next.next = temp;
index++;
}
return root.next;
}else{
ListNode start = head;
ListNode end = head;
while(index<m-1){
start = end = start.next;
index++;
}
end = end.next;
while(index<n-1){
ListNode temp = start.next;
start.next = end.next;
end.next = end.next.next;
start.next.next = temp;
index++;
}
return head;
}
}
}


我把题目大致解析成下图的样子:



可以看到涉及的修改在(m-1)到(n+1)节点之间,所以我首先(17~23行,33~39行)找到(m-1)的位置处,并且把(m-1)和m分别记作start和end节点。

在下图中大致分解了一次循环(25~29行,41~45行)的内容:



start和end保持不变,并且把他们的next都向后移动一个节点,然而这样的挪动会导致有一个节点没有next可以用来访问他,所以我就把这个节点在最开始记录为temp,然后再反向过来。做n-m次即可,最开始的while中index是表示找到的(m-1),在后面的while只是为了作为限制条件(n-m+m-1),没有特殊意义。

最后就得到了结果,在m=1时,我新建了一个root节点虚拟(13~16行),最后返回root.next即可,过程与不从头开始相同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode java