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.
分析:
旋转部分链表。
旋转整条链表的策略是,维护一个dummy头节点,维护一个尾节点,每次讲遍历到的节点移动到头,当尾节点下一个是null 说明旋转完毕。
旋转部分链表的策略是一样的,
先找到m位置之前的一个节点和n位置的节点,之后就是旋转整条链表的问题了。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if(head == null) return null;
ListNode newHead = new ListNode(0);
newHead.next = head;
ListNode preMpoint,Npoint;
preMpoint = Npoint = newHead;
int step = n-m;
while(step >= 0){
Npoint = Npoint.next;
step--;
}
while(m > 1){
Npoint = Npoint.next;
preMpoint = preMpoint.next;
m--;
}
while(preMpoint.next != Npoint){
ListNode temp = preMpoint.next;
preMpoint.next = preMpoint.next.next;
temp.next = Npoint.next;
Npoint.next = temp;
}
return newHead.next;
}
}