Wednesday, September 25, 2013

Reverse Linked List II

Q:
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 ≤ mn ≤ length of list.

A:
public class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        ListNode header = new ListNode(0);
        header.next = head;
        
        ListNode preNode=header, runner = header;// preNode is the node before position m
        for(int i=0;i<n;i++){
            if(i==m-1)
                preNode = runner;
            runner = runner.next;
        }
        // delete the node after preNode and insert it after runner
        while(preNode.next!= runner){
            ListNode node = preNode.next;
            preNode.next = node.next;
            
            node.next = runner.next;
            runner.next = node;
        }
        return header.next;
    }
}



Mistakes:

1:  没有考虑从头结点开始reverse的时候, preNode 会是什么情况。  ------ 解决方法-------自己加了一个header 结点。 2: 虽然是从m...n 这些个位置,但是由于我们是把一个个的,detach,然后插到最前面。  因此, 不需要 detach 第一个 m的位置。---------这样就避免了null pointer exception。 3:考虑到有可能第一个node也被reverse了, 我们就不能直接返回开始的head, 而应该返回header.next。 Learned:

No comments:

Post a Comment