leetcode 19 删除链表的倒数的第n个节点

该文章讨论了如何在给定的链表中删除倒数第n个节点的问题,提出了两种方法:遍历两次和使用快慢指针。在快慢指针方法中,创建一个保护节点以避免越界风险,当快指针比慢指针快n+1步时,慢指针指向的就是要删除的节点的前一个节点,然后更新其next指向。
摘要由CSDN通过智能技术生成

题目:
Given the head of a linked list, remove the nth node from the end of the list and return its head.

Example 1:

Input: head = [1,2,3,4,5], n = 2
Output: [1,2,3,5]

记住!n是指定的是倒数的第几个数

方法一:
遍历二次,一个得链表总长度,找到倒数n+1的节点

方法二:
快慢指针

给了倒数第n个,删除它
其实就是找第n+1个

快慢的步伐怎么确定呢?

当快的比慢的走多 n+1个,当快的走完
慢的刚好到第n+1个

快的就是先从n+1位置开始,后来开始和慢的一样一步一步走

但是如果这样写
for (let i = 0; i < n+1; i++)
会有越界风险
所以要写
for (let i = 0; i < n; i++)
那还要比慢指针快n+1 怎么办呢?
使用保护节点!
let p= new ListNode(0); //定义一个节点
定义一个p.next=head
slow=p;
fast=p;
这样快比慢还是快n+1步
p是不动的,slow要遍历的
最后return p.next

var removeNthFromEnd = function(head, n) {
   let p=new ListNode(null); 
   p.next=head; //保护节点,p不能动
   let fast=p;
   let slow=p;

   for(let i=0; i<n;i++){
       fast=fast.next;
   } 
   while(fast.next){  //记住是fast.next不为null,不是fast
       fast=fast.next;
       slow=slow.next;
   }
   slow.next=slow.next.next;

   return p.next;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值