题解 | #链表内指定区间反转#

链表内指定区间反转

http://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c

遍历一遍,记录位置,反转,即可

详见代码:

import java.util.*;

/**
 * public class ListNode {
 *   int val;
 *   ListNode next = null;
 * }
 */

public class Solution {
    /**
     * 
     * @param head ListNode类 
     * @param m int整型 
     * @param n int整型 
     * @return ListNode类
     */
    public ListNode reverseBetween (ListNode head, int m, int n) {
        // 遍历一遍,记录位置,反转,即可。
        ListNode cur = head;
        // 记录断点,例如{1,2,3,4,5},反转2-4,f1=1,f2=2,f3=4,f4=5
        ListNode f1 = null, f2 = null, f3 = null, f4 = null;
        int i = 1;
        while(cur != null) {
            // 从头节点开始
            if(i == 1) {
                f1 = f2 = head;
            }
          	// 记录 f1 和 f2
            if(i == m - 1){
                f1 = cur;
            } else if(i == m) {
                f2 = cur;
            }
          	// 记录 f3 和 f4
            if(i == n) {
                f3 = cur;
                if(cur.next != null) {
                    f4 = cur.next;
                }
            }
            i++;
            cur = cur.next;
        }


        // 四节点记录完毕,开始反转
      	// 传入 f4 是由于反转数组最后需要返回 prev,等于 f3 的时候需要再循环一次。
        ListNode myhead = ReverseList(f2,f4);
        // 衔接
        if(f1 == f2) {
            if(f4 != null) {
                f1.next = f4;
            }
        } else {
            f1.next = f3;
            f2.next = f4;
        }

        // 判断头节点位置 f1 != f2 说明头部没有变化,变化的是中间或者后面的部分
        if(f1 != f2) {
            return head;
        } else if(f1 == f2) {
          // f1 == f2 ,头节点有变化,例如:{1,2,3}反转1-2,反转完了为{2,1,3}
            return myhead;
        }
        return head;
    }
    
    // 反转链表
    public ListNode ReverseList(ListNode head,ListNode stop) {
        ListNode prev = null, cur = head, temp = null;
        while(cur != stop) {
            temp = cur.next;
            cur.next = prev;
            prev = cur;
            cur = temp;
        }
        return prev;
    }
}
全部评论

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务