算法学习记录(九十五)

58 阅读1分钟

19. 删除链表的倒数第 N 个结点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

image.png

解:

  1. 快慢指针+慢指针的前指针。快慢指针初始都指向头结点,前指针初始指向空,快指针先走n-1步。
  2. 然后三个指针都一起往后走,前指针用于记录慢指针的上一个节点。当快指针走完的时候,慢指针指向倒数第n个节点
  3. 将前指针的next指向慢指针的next
  4. 如果前指针为null表示头结点就是要删除的节点,返回慢指针的下一个节点,否则返回头结点
const removeNthFromEnd = function(head, n) {
    let preNode = null
    let quickNode = head 
    let slowNode = head
    while (--n) quickNode = quickNode.next
    while (quickNode.next) {
        quickNode = quickNode.next
        preNode = slowNode 
        slowNode = slowNode.next 
    }
    preNode && (preNode.next = slowNode.next)
    const res = slowNode.next
    slowNode.next = null
    return preNode ? head : res
};