位置: IT常识 - 正文

【Leetcode】移除链表元素 链表的中间节点 链表中倒数第k个节点(iterator用法 移除对象)

编辑:rootadmin
【Leetcode】移除链表元素 链表的中间节点 链表中倒数第k个节点

推荐整理分享【Leetcode】移除链表元素 链表的中间节点 链表中倒数第k个节点(iterator用法 移除对象),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:iterator移除元素,list 移除,移除list1中所选中的项目,iterator移除元素,list移除一个指定元素,移除list1中所选中的项目,移除list1中所选中的项目,leetcode移除元素,内容如对您有帮助,希望把文章链接给更多的朋友!

目录

一.【Leetcode203】移除链表元素

1.链接

2.题目再现

 A.双指针法

B.类尾删法

C.哨兵位

二.【Leetcode876】链表的中间节点

1.链接:链表的中间节点

2.题目再现

3.解法:快慢指针

三.链表中倒数第k个节点

1.链接:链表中倒数第k个节点

2.题目再现

3.解法 :快慢指针


一.【Leetcode203】移除链表元素1.链接

移除链表元素

2.题目再现

 A.双指针法

1.创建一个指针 cur=head  和一个指针  pre=NULL;  

2.用cur->val 与 val 比较,如果不相等则把 cur 赋给 pre 使cur 指向下一个节点,即

   cur=cur->next;

3.如果相等则使 pre 的 next 指向 cur 的 next ,即:

 pre->next=cur->next ,然后再 free 掉 cur ,最后再使 cur 等于 pre 的 next,注意在进行这些步骤之前要判断 pre 是否为空 ,若为空即为头删;

演示:

双指针

代码:

struct ListNode* removeElements(struct ListNode* head, int val){ struct ListNode*pre=NULL; struct ListNode*cur=head; while(cur) { if(cur->val!=val) { pre=cur; cur=cur->next; } else { if(pre==NULL) { head=cur->next; free(cur); cur=head; } else { pre->next=cur->next; cur=pre->next; } } } return head;}B.类尾删法

1.创建一个新的指针newhead ,同时为了省去找尾的麻烦,我们可以定义一个尾指针 tail 来保存尾节点;

2.再创建一个指针 cur =head ,用来遍历链表;

3.如果 cur->val != val ,则尾插 ,注意要判断 tail 是否为空 ,类似于单链表的尾插那部分,如果不理解的话,可查看文章 :单链表的增删查改;

4.如果 cur->val ==val,则 cur=cur->next ;

5.最后要将尾节点置空。

演示:

类尾插

代码:

struct ListNode* removeElements(struct ListNode* head, int val){ struct ListNode *newhead=NULL; struct ListNode*tail=NULL; struct ListNode*cur=head; while(cur) { if(cur->val!=val) { if(tail==NULL) { newhead=tail=cur; } else { tail->next=cur; tail=tail->next; } cur=cur->next; } else { cur=cur->next; } } if(tail) { tail->next=NULL; } return newhead;}C.哨兵位

1.malloc 一个哨兵位节点 dummyhead,使其 next 指向 head ;

2.再定义一个节点 tmp = dummyhead ,用这个遍历链表;

【Leetcode】移除链表元素 链表的中间节点 链表中倒数第k个节点(iterator用法 移除对象)

3.注意因为 tmp ->next 才是 head ,所以 while 里要写 tmp->next !=NULL

演示:

移除链表元素 哨兵位法动态演示

代码:

struct ListNode* removeElements(struct ListNode* head, int val){ struct ListNode*dummyhead=(struct ListNode*)malloc(sizeof(struct ListNode)); dummyhead->next=head; struct ListNode*tmp=dummyhead; while(tmp->next!=NULL) { if(tmp->next->val==val) { tmp->next=tmp->next->next; } else { tmp=tmp->next; } } return dummyhead->next;}二.【Leetcode876】链表的中间节点1.链接:链表的中间节点2.题目再现

3.解法:快慢指针

1.定义一个快指针 fast 和一个慢指针 slow 都初始化为 head;

2.遍历链表,快指针一次走2步,慢指针一次走1步 ;

3.注意:因为链表的长度可能是单数也可能是双数,所以当我们已 fast 是否为NULL 作为循环控制条件的话,要在 fast 走2步前判断 fast->next 是否为空;

4.最后慢指针就是中间节点。

演示:

链表中间节点 快慢指针动态演示

代码:

struct ListNode* middleNode(struct ListNode* head){ struct ListNode*slow=head; struct ListNode*fast=head; while(fast) { if(fast->next==NULL) //注意判断 { break; } else { fast=fast->next->next; //fast 走2步 } slow=slow->next; //slow 走1步 } return slow; //返回慢指针}三.链表中倒数第k个节点1.链接:链表中倒数第k个节点2.题目再现

3.解法 :快慢指针

1.定义一个快指针 fast 和一个慢指针 slow 都初始化为 head;

2.因为倒数第k个节点和尾节点的差为 k-1  ,所以我们先让快指针先走 k-1 步;

或者因为尾节点所指向的NULL 和倒数第k个节点相差k,也可以先让快指针走k步;

这个时候慢指针不动;

3.快指针走完后,快指针和慢指针依次走,每次只走1步;

注意,如果是k-1,那么遍历结束的条件是fast->next 是否为空 ,如果是k,那么遍历结束的条件是fast 是否为空;

4.返回慢指针。

演示:

链表倒数第K个节点 快慢指针动态演示

代码:

struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ){ if(pListHead==NULL) { return NULL; } struct ListNode*slow=pListHead; struct ListNode*fast=pListHead; while(k--) //这里以先走k步为例 { if(fast==NULL) { return NULL; } fast=fast->next; } while(fast) { slow=slow->next; fast=fast->next; } return slow;}

😽本篇文章到此就结束了,若有错误或是建议,欢迎小伙伴们指出;😻

😍请多多支持博主哦~🥰

🤩谢谢你的阅读~😃

本文链接地址:https://www.jiuchutong.com/zhishi/299785.html 转载请保留说明!

上一篇:未来社区的人车房隐私数据权属确认方法(未来社区政策支持)

下一篇:又一个开源第一!飞桨联合百舸,Stable Diffusion推理速度遥遥领先(开源ei)

  • 从租计征房产税怎么申报
  • 股权转让给个人和公司的区别
  • 利润分配的规则
  • 小规模纳税人报税前需要做什么
  • 利润率的百分比
  • 利润表管理费用怎么算
  • 幼儿园伙食收支盈亏比例
  • 黄金以旧换新怎么算费用
  • 应付账款多计怎么处理
  • 委托代销收取手续费账务处理
  • 航天信息维护费280元报税怎么抵扣
  • 地税逾期申报怎么处理
  • 核定征收的企业需要做账吗
  • 跨区域施工增值税怎么交
  • ca浏览器组件如何下载?
  • 三联专用发票每一联分别给谁
  • 高新技术企业认定条件
  • 破产清算重整和解
  • 企业的无形资产包括哪些内容
  • 契税纳税义务发生时间税屋
  • win11怎么设置桌面显示我的电脑
  • 王者荣耀电脑版叫啥名字
  • 变动成本法和完全成本法利润差异
  • 跨越红字专用发票开票流程
  • 个人开发是什么意思
  • 股东能随便提走入账资金吗
  • 收到增值税进项税增量留抵退税如何列报
  • PHP:oci_set_action()的用法_Oracle函数
  • php 生成验证码
  • 增值税税控系统折旧
  • 喜加一平台
  • php面向对象优点,缺点
  • win11系统怎么删除账户
  • PHP:Memcached::getByKey()的用法_Memcached类
  • 现金解款单的使用范围
  • 实际发放股票股利为什么股本增加
  • 脐橙产业可行性报告
  • vue3.0项目
  • ip6tables-save命令 保存ip6tables表配置
  • 归还股东投资款
  • mysql从一张表更新到另一张表
  • python 熵值法
  • 购礼品送客户的文案
  • 坏账核销的会计处理
  • 处置长期股权投资其他综合收益结转
  • 信用减值损失是什么项目
  • 外购商品发放给员工 进项税额能不能抵扣
  • 以前年度损益调整会计分录
  • 上年未结转的成本今年可以结转吗
  • 专项拨款会计分录
  • 营业外收入是损益类账户吗
  • 进口免税产品如何开票
  • 传媒公司的骗局把戏
  • 更正会计凭证摘要怎么写?
  • 办公费项目内容
  • 小规模纳税人收入不能超过多少
  • 年度损益调整的会计分录
  • 可转债不卖会亏钱吗
  • 接受其他企业现金捐赠会计分录
  • 房租增值税专用发票几个点
  • mysql数据库全量备份
  • 在windows xp
  • xp系统的硬盘装到win7电脑
  • win80x0000007b修复
  • hmies.exe是什么
  • sisusbrg.exe - sisusbrg是什么进程 有什么用
  • win8的应用商店
  • w7系统如何设置
  • linux创建目录函数
  • win8怎么设置时间自动更新
  • 基于socket的聊天程序
  • nodejs怎么调试
  • Python Requests安装与简单运用
  • javascriptjs
  • 交通运输业的税率9%和13%
  • 外地经营预缴企业所得税
  • 电子税务平台怎么开发票
  • 医院盖章去哪个部门
  • 如何挑选烟叶等级
  • 商贸有限公司怎么运营
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设