首页 > 编程语言 >算法刷题_删除链表的倒数第N个结点

算法刷题_删除链表的倒数第N个结点

时间:2024-12-23 21:01:35浏览次数:10  
标签:slow ListNode fast next 链表 dummyhead 节点 倒数第 刷题

算法刷题Day8_删除链表的倒数第N个结点


文章目录


前言


一、双指针思想

双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。

二、具体步骤

1.定义快慢指针

在这里插入图片描述

代码如下(示例):

ListNode *dummyhead=new ListNode(0);
dummyhead->next=head;
ListNode *fast=dummyhead;
ListNode *slow=dummyhead;

2.fast指针先移动n+1步

在这里插入图片描述

fast 指针先提前向前移动 n+1 步;
然后 slow 和 fast 同时移动,直到 fast 到达链表末尾。
此时,slow 指针正好指向 待删除节点的前一个节点。为了确保 slow 指针最终指向待删除节点的前一个节点,我们需要让 fast 和 slow 在后续同时移动时,保持一定的间距(n+1)。假如我们不让 fast 再多走一步(即不执行 fast = fast->next;),当 fast 到达最后一个节点时,slow 会停在 待删除节点的位置,

代码如下(示例):

while(n--&&head!=NuLL){
	fast=fast->next;
	}
fast=fast->next;//fast再提前走一步,因为需要让slow指向删除节点的上一个节点;

3.fast和slow一起移动

代码如下(示例):

while(fast!=NuLL){
	fast=fast->next;
	slow=slow->next;
	}

4.删除倒数第N个节点

在这里插入图片描述
代码如下(示例):

slow->next=slow->next->next;

三、完整代码

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* dummyhead=new ListNode(0);
        dummyhead->next=head;
        ListNode* fast=dummyhead;
        ListNode* slow=dummyhead;    
    while(n--&&fast!=nullptr){
        fast=fast->next;
    }
    fast=fast->next;
    while(fast!=nullptr){
        fast=fast->next;
        slow=slow->next;
    }
    slow->next=slow->next->next;
    return dummyhead->next;
    }
};

总结

间距的值:n+1
目的: 确保 slow 指向待删除节点的前一个节点,从而方便删除操作。
如何实现: 通过让 fast 在初始化阶段多走一步,建立 n+1 的间距,然后 fast 和 slow 再同时移动直到 fast 到达链表末尾。

标签:slow,ListNode,fast,next,链表,dummyhead,节点,倒数第,刷题
From: https://blog.csdn.net/qq_46001754/article/details/144676171

相关文章

  • LRU 缓存(哈希表+双向链表)
    请你设计并实现一个满足  LRU(最近最少使用)缓存 约束的数据结构。实现 LRUCache 类:LRUCache(intcapacity) 以 正整数 作为容量 capacity 初始化LRU缓存intget(intkey) 如果关键字 key 存在于缓存中,则返回关键字的值,否则返回 -1 。voidput(intkey,......
  • 合并 K 个升序链表(归并排序)
    给你一个链表数组,每个链表都已经按升序排列。请你将所有链表合并到一个升序链表中,返回合并后的链表。示例1:输入:lists=[[1,4,5],[1,3,4],[2,6]]输出:[1,1,2,3,4,4,5,6]解释:链表数组如下:[1->4->5,1->3->4,2->6]将它们合并到一个有序链表中得到。1->1->2->3->4->......
  • LeetCode《图解算法数据结构》链表:图书整理 I
    题目书店店员有一张链表形式的书单,每个节点代表一本书,节点中的值表示书的编号。为更方便整理书架,店员需要将书单倒过来排列,就可以从最后一本书开始整理,逐一将书放回到书架上。请倒序返回这个书单链表。输入head=[3,6,4,1]输出[1,4,6,3]解法1:递归classSolution{public......
  • 【数据结构练习题】顺序表与链表LinkedList
    顺序表与链表LinkedList选择题链表面试题1.删除链表中等于给定值val的所有节点。2.反转一个单链表。3.给定一个带有头结点head的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。4.输入一个链表,输出该链表中倒数第k个结点。5.将两个有......
  • 7-13刷题
    7.13刷题[NewStarCTF公开赛赛道]UnserializeOne<?phperror_reporting(0);highlight_file(__FILE__);#Somethingusefulforyou:https://zhuanlan.zhihu.com/p/377676274classStart{public$name;protected$func;publicfunction__destruct()#12当一......
  • 4-14文件上传刷题日记
    buuctf[是兄弟就来传马先传一个php木马页面报错,随便改一个后缀,看看是黑名单还是白名单过滤,这里php代码前加GIF89a绕过图片大小检查报错,接着试一下是不是MIME过滤Content-Type:image/png上传成功/var/www/html/upload/743be915f2c6ab5de3600d87068cafd2/hack.jpgsuccesfu......
  • 【LeetCode: 141. 环形链表 + 链表】
    ......
  • 排序链表(归并排序)
    给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例1:输入:head=[4,2,1,3]输出:[1,2,3,4]示例2:输入:head=[-1,5,3,4,0]输出:[-1,0,3,4,5]示例3:输入:head=[]输出:[] 方法一:归并排序/***Definitionforsingly-linkedlist.*s......
  • 随机链表的复制(哈希表)
    给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都......
  • K 个一组翻转链表(逆置链表+递归)
    给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。 示例1:输入:head......