阅读 281

JS反转指定范围内的链表(实现单链表的反转)

正题

反转链表 II

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。  

示例 1:

image.png

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]复制代码

示例 2:

输入:head = [5], left = 1, right = 1
输出:[5]复制代码

解析: 本题目的在于翻转指定范围内的链表,那么最大的问题就是如何翻转链表,可以参考之前的文章: 一张图说明反转链表

如果弄懂了如何从头到位翻转一张链表,那么这题就比较好解决了。仅仅是在此基础上,从不同的位置,反转到不同的位置即可,那么我们可以给出以下一种思路:

能用动图说明问题的,绝不打字!

1.gif

第一步:创建一个方法,用来翻转全列表

var reverse = function (head, end) {
    let pre = end
    let cur = head
    while(cur !== end) {
        const next = cur.next
        cur.next = pre
        pre = cur
        cur = next
    }
    return pre
}复制代码

这里多带了一个参数 end,目的就是为了为 放回原位 做尾部对接,end 表明了最终反转到 end 之前的位置即可,并且将反转后的链表拼接 end, 所以在世纪操作中是这样的:

1.gif

这样做的好处是将end 直接反转了,尾部直接就拼接上了。最后再将头部拼接即可。

边界问题:

  1. 链表只存在一个节点的话,那么直接返回该节点

  2. 需要翻转的链表从第一个节点开始的话,不存在头部拼接问题

完整代码:

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @param {number} left
 * @param {number} right
 * @return {ListNode}
 */

var reverse = function (head, end) {
    let pre = end
    let cur = head
    while(cur !== end) {
        const next = cur.next
        cur.next = pre
        pre = cur
        cur = next
    }
    return pre
}

var reverseBetween = function(head, left, right) {
    if (head.next === null) {
        return head
    }
    let tempHead = head
    let tempEnd = head
    let index = 1
    let pre = null
    let after = null
    while(index < right) {
       if (index < left) {
           pre = tempHead
           tempHead = tempHead.next
       }
       tempEnd = tempEnd.next
        index++
    }
    after = tempEnd.next
    console.log({tempHead, after})
    const newList = reverse(tempHead, after)
    console.log({newList, pre})
    pre ? pre.next = newList : head = newList
     return head
};


作者:欧浪浪
链接:https://juejin.cn/post/7037036490353803271

 伪原创工具 SEO网站优化  https://www.237it.com/ 


文章分类
代码人生
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐