您的位置:首页 > 其它

个人记录-LeetCode 92. Reverse Linked List II

2017-02-23 20:25 423 查看

问题:

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.

代码示例:

问题要求,逆向重排m~n之间的节点。

主要思路:

1、改变m~n之间next的指向,

即将a->b->c,变为a<-b<-c;

2、让m-1指向节点n,m指向n+1

代码如下:

/**
* 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) {
//m、n一致时,不需要改变
if (m == n) {
return head;
}

//记录m-1和m的位置
ListNode beforeM = null;
ListNode nodeM = null;

//记录n和n+1的位置
ListNode afterN = null;
ListNode nodeN = null;

//记录位置
int count = 0;

ListNode tmp = head;

//记录m~n中每个节点的前一个位置
ListNode before = null;

while (tmp != null) {
++count;

//记录m-1的信息
if (count == m - 1) {
beforeM = tmp;
tmp = tmp.next;
} else if (count == m) {
//记录m的信息
nodeM = tmp;

//从m+1开始,需要使用before信息
before = tmp;

tmp = tmp.next;
} else if (count > m && count < n) {
//m~n之间,改变节点next的指向
ListNode next = tmp.next;
tmp.next = before;
before = tmp;
tmp = next;
} else if (count == n) {
//记录n和n+1的信息
nodeN = tmp;
afterN = nodeN.next;
nodeN.next = before;

//后面的不用管了
break;
} else {
//0~m-1之间时,正常移动即可
tmp = tmp.next;
}
}

//m-1指向n
if (beforeM != null) {
beforeM.next = nodeN;
} else {
//m为第一个节点时,逆向后n为头节点
head = nodeN;
}

//按题目的条件,m不会为null,next指向n+1
if (nodeM != null) {
nodeM.next = afterN;
}

return head;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: