链表指定区间反转-java

链表内指定区间反转

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

解题思路

将链表分为三个部分:前m-1个节点、中间n-m+1个节点、第n个节点之后的部分

Step1: 前m-1个节点尾插法插入到新的链表
Step2: 以Step1的结果的最后一个结点作为头将中间n-m+1个以头插法插入,并记录尾结点。
Step3: 将剩余部分拼接到Step2的结果尾结点后。

    public ListNode reverseBetween (ListNode head, int m, int n) {
        // write code here
        ListNode newHead = new ListNode(-1);
        newHead.next = head;
        ListNode p1 = newHead;

        // 尾插法插入m-1个节点
        for(int i=1; i<m && null != p1; ++i) {
            p1 = p1.next;
        }

        // 头插法插入 n-m+1个节点
        ListNode cur = p1.next;
        p1.next = null;

        ListNode tail = null;
        for(int i=1; i<= n-m+1 && cur != null; ++i) {
            ListNode tempNode = cur;
            cur = cur.next;
            tempNode.next = p1.next;
            p1.next = tempNode;
            // 记录头插法产生端的尾结点
            if(null == tail) {
                tail = tempNode;
            }
        }

        tail.next = cur;
        return newHead.next;
    }
全部评论

相关推荐

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