前端算法小白攻略8-leetcode(删除链表的倒数第 N 个节点)

130 阅读1分钟

前言

删除链表的节点我们理解起来很简单,无非就是将待删除节点的前一个节点的指针指向待删除节点的后一个节点即可,那么正向删除,我们只要找到节点的前一个节点和后一个节点即可,如果倒数节点反向删除呢?

题目描述

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

示例 1: 示例 1:

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

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

解题思路

图片.png 由上图可总结如下:

  1. 因为头节点可能会被删除,我们借助虚拟头
  2. 我们需要两个指针pre,cur,让pre和cur保持n个节点的距离,pre在原点,cur先走n步即可实现
  3. 接着让pre和cur一起走,我们知道当cur走到null时,pre是指向倒数第n个节点的也就是我们要删除的节点
  4. 要执行删除操作我们需要知道前后节点,所以cur.next = null时停下来即可

开始解题

var removeNthFromEnd = function(head, n) {
    let ret = new ListNode(-1,head),pre = ret, cur = head;
    while(--n) {  // --n对应上图第3步的n-1,完成cur比pre领先n步
        cur = cur.next;
    }
    while(cur.next) { // pre,cur同时走,走到cur.next = null,停下来,pre走到N的前个节点
        cur = cur.next;
        pre = pre.next;
    }
    pre.next = pre.next.next; // 直接让pre连接N的后一个节点即pre.next.next完成删除N的操作
    return ret.next;
};