位置: 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)

  • 旧面包车能跑长途吗
  • 一般纳税人内账税金的处理
  • 借递延所得税资产贷其他综合收益
  • 在建无形资产入账
  • 银行内部利息支出
  • 负利润的话小型微利企业减免企业所得税吗
  • 普票能抵扣多少
  • 打印机费用是属于管理费用吗
  • 新会计准则中计提减值如何回转
  • 物业电费加价如何举报
  • 进口关税税率和增值税
  • 年底员工借款如何处理
  • 网站服务器使用什么IP地址
  • 如何网上认证发票流程
  • 国税票怎么开
  • 旅行社开具的发票是不都得写旅游服务
  • 土地一次开发和二次开发
  • 预提 冲销
  • 企业的其他业务收入
  • 企业接受非现金资产投资的账务处理
  • 异地 发票
  • 固定资产报废需要在固定资产系统中
  • win11如何启用远程访问
  • 应收账款账面价值小于计税基础
  • 云下载并重新安装
  • win7防火墙设置不了
  • php rewrite
  • 公司客户招待费用标准
  • 采用权益法核算
  • 材料成本差异属于成本类账户吗
  • .info是什么意思?
  • au_.exe是什么进程
  • php redis实现秒杀思路
  • framework怎么用
  • 期末应交增值税转入未交增值税
  • vue组件继承element并重写方法
  • 法人从公账上取款会计分录
  • 气温和降水空间变化一月平均气温规律是什么原因是什么
  • php忘记密码
  • 水利基金忘记申报怎么查
  • 工会经费的来源包括
  • 帮别人代发工资有没有风险
  • 下列项目的进项税额可以从销售税额中抵扣的是
  • 什么是三证合一纳税人
  • 原始凭证的基本内容有会计分录吗
  • 存货的入账价值等于
  • 外出经营流程
  • 个体户与公司的差别
  • 什么叫非限定性不定方程
  • 借款与报销流程设计
  • 企业长期股权投资增加说明什么
  • 开发成本的会计科目编码
  • 应收账款周转率高说明
  • 原材料保险公司赔偿会计分录怎么写
  • 土地出让金抵减销项税计算
  • 企业支付宝要手续费吗
  • 商品销售企业成本包括
  • 维修基金只有收据没有发票吗
  • MYSQL数据库应用
  • window组策略
  • ubuntu configure
  • linux系统文件压缩命令
  • win7系统加内存条怎么设置
  • window10怎么升11
  • linux安装的命令是啥
  • 硬盘已经安装系统文件夹
  • win8怎么修改电脑密码修改
  • win10系统无法打开百度网盘
  • Node.js中的全局对象有
  • unity gui
  • unity 2d ik
  • unity quaternion.angle
  • Android include 标签注意点
  • 个人总结的几个方面
  • duck有鸭肉的意思吗
  • 产品税务编号查询系统官网
  • 国家税务总局千户集团
  • 南京国家税务局网上办税服务厅
  • 河北省国家税务局电子税务局官网入口
  • 重庆车牌号申请
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

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

    友情链接: 武汉网站建设