Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given
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.
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
Solution: iterator
分为两个步骤,
第一步是找到m结点所在位置,
第二步就是进行反转直到n结点。反转的方法就是每读到一个结点,把它插入到m结点前面位置,然后m结点接到读到结点的下一个。总共只需要一次扫描,所以时间是O(n),只需要几个辅助指针,空间是O(1)。
/**
* 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 pre = new ListNode(0);
pre.next = head;
head = pre;
int k = m - 1;
ListNode n1 = head;
while(k > 0) { //move pointer points to the node before m
n1 = n1.next;
k--;
}
pre = n1; //pre points to the node before m node
n1 = n1.next;
k = n - m;
while(n1 != null && k > 0) {
ListNode temp = n1.next;
n1.next = temp.next;
temp.next = pre.next;
pre.next = temp;
k--;
}
return head.next;
}
}
No comments:
Post a Comment