Description
Reverse a linked list from position m to n. Do it in one-pass.
Note: 1 ≤ m ≤ n ≤ length of list.
Example:
Input: 1->2->3->4->5->NULL, m = 2, n = 4
Output: 1->4->3->2->5->NULL
Solution
反转链表指定位置的节点。
First, according to m, we use a dummy head to start iteration of the list, and then stop at m - 1. Then use a current node and a then node to define the nodes we want reverse. Since n - m > 1 we could start reverse, I < n - m.
The reverse process is change then’s next to pre’s next, then let then be the next node of prev. So we use cur.next to store then’s next(it also enables link node m to n + 1). then node are always walking ahead.
Code
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
class Solution {
public ListNode reverseBetween(ListNode head, int m, int n) {
if (head == null)
return null;
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode pre = dummy;
for (int i = 0; i < m - 1; i++){
pre = pre.next;
}
ListNode cur = pre.next;
ListNode then = cur.next;
for (int i = 0; i < n - m; i++){
cur.next = then.next;
then.next = pre.next;
pre.next = then;
then = cur.next;
}
return dummy.next;
}
}
Time Complexity: O(n)
Space Complexity: O(1)
Review
For problem of node, check null first.