美文网首页
36. 翻转链表 II

36. 翻转链表 II

作者: 6默默Welsh | 来源:发表于2018-03-10 15:01 被阅读14次

    描述

    翻转链表中第m个节点到第n个节点的部分

    注意事项

    m,n满足1 ≤ m ≤ n ≤ 链表长度

    样例

    给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4->3->2->5->null

    挑战

    在原地一次翻转完成

    代码

    /**
     * Definition for ListNode
     * public class ListNode {
     *     int val;
     *     ListNode next;
     * }
     */
    public class Solution {
        public ListNode reverseBetween(ListNode head, int m, int n) {
            if (m >= n || head == null) {
                return head;
            }
            
            ListNode dummy = new ListNode(0);
            dummy.next = head;
            head = dummy;
            
            for (int i = 1; i < m; i++) {
                if (head == null) {
                    return null;
                }
                head = head.next;
            }
            
            // premNode 代表第 m-1 个结点
            ListNode premNode = head;
            // mNode 是第 m 个结点即要翻转的第一个结点,翻转后的最后一个结点
            ListNode mNode = head.next;
            // 两根指针
            ListNode nNode = mNode, postnNode = mNode.next;
            // 翻转
            for (int i = m; i < n; i++) {
                if (postnNode == null) {
                    return null;
                }
                ListNode temp = postnNode.next;
                postnNode.next = nNode;
                nNode = postnNode;
                postnNode = temp;
            }
            // 最后 nNode 指向第 m 个结点,postnNode 指向第 m+1 个结点
            // 连接
            mNode.next = postnNode;
            premNode.next = nNode;
            
            return dummy.next;
        }
    }
    

    相关文章

      网友评论

          本文标题:36. 翻转链表 II

          本文链接:https://www.haomeiwen.com/subject/ctnmfftx.html