2014年5月10日星期六

Loop Solution - Reverse Linked List II

The idea is to find the m and n nodes, save the preNode before m, and afterNode after n… the tricky part is that define a newHead which next is original head, this could avoid if m == 0, the preNode is null… in this case, it always not null… at least is the newHead… more attend to reverse process.

/**
 * 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(Integer.MAX_VALUE);
        newHead.next = head;
        ListNode lastTail = newHead;
        ListNode mHead = newHead.next;
        ListNode nPlusNode = newHead.next;
        ListNode lNode = head;
        int i = 1;
        while(i <= n){
            if(lNode == null){
                return null;
            }
            if(i == m - 1){
                lastTail = lNode;
            }
            if(i == m){
                mHead = lNode;
            }
            if(i == n){
                nPlusNode = lNode.next;
                lNode.next = null;
                break;
            }
            lNode = lNode.next;
            i++;
        }
       
        ListNode newMHead = reverseList(mHead);
        lastTail.next = newMHead;
        ListNode loop = newMHead;
        while(loop.next != null){
            loop = loop.next;
        }
        loop.next = nPlusNode;
        return newHead.next;
    }
   
private ListNode reverseList(ListNode node) {
if (node == null || node.next == null) {
return node;
}
ListNode newHead = new ListNode(node.val);
newHead.next = null;
ListNode lp = node.next;
while (lp != null) {
ListNode nextNode = lp.next;
lp.next = newHead;
newHead = lp;
lp = nextNode;
}
return newHead;
}
   
    private ListNode reverse(ListNode head){
        if(head == null || head.next == null){
            return head;
        }
        ListNode newHead = new ListNode(Integer.MAX_VALUE);
        newHead.next = head;
        ListNode node = head.next;
        head.next = null;
        ListNode preNode = head;
        while(node != null){
            ListNode temp = node;
            newHead.next = temp;
            node = node.next;
            temp.next = preNode;
            preNode = temp;
        }
        return newHead.next;
    }
}

没有评论: