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->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.

Solution: first attempt

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
public class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        int i=0;
        ListNode scan=head, reverse=null;
        ListNode preNodeM = new ListNode(0);
        preNodeM.next = head;
        while(scan!=null){
            i++;
            
            if(i==m-1) preNodeM=scan;
            
            if(i<m) {
                scan = scan.next;
                continue;
            } else if(i>n) {
                preNodeM.next.next = scan;
                preNodeM.next = reverse;
                break;
            } else {
                ListNode tmp = scan.next;
                scan.next = reverse;
                reverse = scan;
                scan = tmp;
            }
        }
        preNodeM.next = reverse;
        return m==1 ? reverse : head;
        
    }
}

attempt 2

public class Solution {
    public ListNode reverseBetween(ListNode head, int m, int n) {
        ListNode dummy = new ListNode(0);
        ListNode pre=dummy, reverse=null, nodeM=null;
        dummy.next = head;
        int num = 0;
        while(pre.next!=null){
            num++;
            if(num==m) nodeM=pre.next;
            if(num<m) {pre=pre.next; continue;}
            if(num>n) break;
            
            ListNode tmp = pre.next.next;
            pre.next.next = reverse;
            reverse = pre.next;
            pre.next = tmp;
        }
        /* have to put the following outside while-loop */
        nodeM.next=pre.next; 
        pre.next=reverse;
        
        return dummy.next;
    }
}
comments powered by Disqus