Friday, March 6, 2015

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->NULLm = 2 and n = 4,
return 1->4->3->2->5->NULL.
Note:
Given mn 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