92.反转链表ll

78 阅读1分钟

思路

记录left和right的值反转中间然后接上去

代码

     var reverseBetween = function (head, left, right) {
            // 因为头节点有可能发生变化,使用虚拟头节点可以避免复杂的分类讨论
            const newHead = new ListNode(-1);
            newHead.next = head;

            let p1 = newHead;
            // p1一直移到left的前一项
            for (let i = 0; i < left - 1; i++) {
                p1 = p1.next;
            }

            //保留p1,切断其next后p1就是拼接的左链表的最后一个元素
            //p2 移动到left处,切断其next后,p2.next就是拼接的右链表的第一个元素
            let p2 = p1;
            for (let i = 0; i < right - left + 1; i++) {
                p2 = p2.next;
            }
            
            //中间需要反转的链表
            let p3 = p1.next;
            //拼接的右链表的第一个元素
            let p4 = p2.next;

            //切断连接
            p1.next = null;
            p2.next = null;

            //反转
            reverseLinkedList(p3);

            // 拼接链表,链表反转后第一个元素为其原来的最后一个元素p2
            p1.next = p2;
            p3.next = p4;
            return newHead.next;
        };
      const reverseLinkedList = (head) => {
            let p1 = head;
            let p2 = null;

            while (p1) {
                const n = p1.next;
                p1.next = p2;
                p2 = p1
                p1 = n;
            }
        }
       

复杂度

时间:O(n)

空间: O(n)