(javaScript)leetcode每日一题 - 19. 删除链表的倒数第 N 个结点

112 阅读1分钟

leetcode每日一题 - 19. 删除链表的倒数第 N 个结点

image.png

题解

快慢指针
1、设置虚拟节点 dummyHead 指向 head
2、设定双指针 p 和 q,初始都指向虚拟节点 dummyHead
3、移动 q,直到 p 与 q 之间相隔的元素个数为 n
4、同时移动 p 与 q,直到 q 指向的为 NULL
5、将 p 的下一个节点指向下下个节点
cc43daa8cbb755373ce4c5cd10c44066dc770a34a6d2913a52f8047cbf5e6e56-file_1559548337458.gif

贴出代码

function removeNthFromEnd(head: ListNode | null, n: number): ListNode | null {
    // 这道题用双指针的做法
    // 创建dumy并添加到链表头部
    let dummy = new ListNode()
    dummy.next = head
    // 创建快慢双指针(n2要比n1提前n个针位) // n2比n1多n个身位,但是我们要的是n1的前一位
    let n1 = dummy
    let n2 = dummy
    for (let i = 0; i <= n; i++) {
      n2 = n2.next!
    }
    while (n2 !== null) {
      n1 = n1.next!
      n2 = n2.next!
    }
    n1.next = n1.next!.next
    return dummy.next
  }