Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

92. 反转链表 II #28

Open
webVueBlog opened this issue Sep 12, 2022 · 0 comments
Open

92. 反转链表 II #28

webVueBlog opened this issue Sep 12, 2022 · 0 comments

Comments

@webVueBlog
Copy link
Owner

92. 反转链表 II

Description

Difficulty: 中等

Related Topics: 链表

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

示例 1:

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

示例 2:

输入:head = [5], left = 1, right = 1
输出:[5]

提示:

  • 链表中节点数目为 n
  • 1 <= n <= 500
  • -500 <= Node.val <= 500
  • 1 <= left <= right <= n

进阶: 你可以使用一趟扫描完成反转吗?

Solution

Language: JavaScript

/**
 * 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 reverseBetween = function(head, left, right) {
    const dummyNode = new ListNode(-1)
    dummyNode.next = head // 虚拟节点
    let pre = dummyNode
    for (let i = 0; i < left - 1; i++) {
        // pre 遍历到left前一个节点
        pre = pre.next
    }

    let rightNode = pre
    for (let i = 0; i < right - left + 1; i++) {
        // rightNode 遍历到right的位置
        rightNode = rightNode.next
    }

    let leftNode = pre.next // 保存leftNode
    let curr = rightNode.next // 保存rightNode.next

    // 切断left到right的子链
    pre.next = null
    rightNode.next = null

    // 反转left到right的子链
    reverseLinkedList(leftNode)

    // 反转 连接
    pre.next = rightNode
    leftNode.next = curr
    return dummyNode.next
};

const reverseLinkedList = (head) => {
    let pre = null
    let cur = head

    while (cur) {
        const next = cur.next
        cur.next = pre
        pre = cur
        cur = next
    }
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant