当前位置: 首页 > news >正文

[LeetCode]-876.链表的中间结点-206.反转链表-21.合并两个有序链表-203.移除链表元素

目录

876.链表的中间结点

题目

 思路

 代码

206.反转链表

题目

思路

代码

21.合并两个有序链表

题目

思路

代码

203.移除链表元素

题目

思路

 代码


876.链表的中间结点

876. 链表的中间结点 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/middle-of-the-linked-list/description/

题目

给你单链表的头结点 head ,请你找出并返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。

示例:

 思路

快慢指针法:在单链表头节点head位置创建两个指针fast和slow,两个指针通过while循环依次向后遍历,slow一次跨越一个节点slow->next,fast一次跨越两个节点fast->next->next,当fast或fast的下一节点fast->next为空时,终止循环,则此时的slow所在节点为中间节点。

 

 代码

struct ListNode* middleNode(struct ListNode* head) {struct ListNode* slow=head,*fast=head;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;}return slow;
}

206.反转链表

206. 反转链表 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/reverse-linked-list/description/

题目

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例: 

思路

依次断开原链表的第一个节点,用头插的方式插入新链表,注意注意要保存好cur的下一节点next。

代码

struct ListNode* reverseList(struct ListNode* head){struct ListNode* cur=head;struct ListNode* newhead=NULL;while(cur){//保存下一节点struct ListNode* next=cur->next;//头插cur->next=newhead;newhead=cur;cur=next;}return newhead;
}

21.合并两个有序链表

21. 合并两个有序链表 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/merge-two-sorted-lists/description/

题目

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

示例:

思路

创建一个新的结构体指针head作为合成的新链表,

创建两个指针,指向两个链表,将两个有序链表从头节点开始,依次进行比较,取较小的尾插到新的链表,通过while循环直到其中一个链表为空,不为空的链表直接尾插到新链表即可。

 图示如下👇

在插入第一个节点前,我们也可以选择放一个哨兵位在头节点前面(哨兵位不算链表节点),这样就减少了第一次尾插时对tail是否为空的判断,代码更加简洁。

代码

不带哨兵位

带哨兵位

203.移除链表元素

203. 移除链表元素 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/remove-linked-list-elements/description/

题目

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

示例:

思路

 这道题可以用双指针法,两个指针逐渐向后遍历,当遇到满足cur->val=val的节点时,(满足cur==hand时用头删的方法)cur到下一节点保存下一节点,同时删除满足条件的节点,每趟循环cur会赋给prev,cur再到下一节点,当cur遍历链表完为NULL的时候,prev刚好在最后一个节点,prev->next为链表结尾赋NULL。

 代码

struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* prev=NULL,* cur=head;while(cur){if(cur->val==val){if(cur==head){head=cur->next;free(cur);cur=head;}else{prev->next=cur->next;free(cur);cur=prev->next;}}else{prev=cur;cur=cur->next;}}return head;}

http://www.lryc.cn/news/218254.html

相关文章:

  • 通过git多人协调开发
  • CentOS 7 通过 yum 安装 MariaDB(Mysql)
  • 【Solidity】Remix在线环境及钱包申请
  • ARFoundation系列讲解 - 92 涂鸦效果
  • 立创eda专业版学习笔记(8)(运行模式)
  • 349.两个数组的交集+350.两个数组的交集II(set/multiset)
  • 数据结构与算法之排序: 桶排序 (Javascript版)
  • Android studio新版本多渠道打包配置
  • PTA:后序和中序构造二叉树
  • 二十三种设计模式全面解析-适配器模式的妙用:异构数据库和不同版本API的完美兼容!
  • K7系列FPGA进行FLASH读写1——CCLK控制(STARTUPE2原语)
  • 【Kafka】基本概念
  • 如何在Vue3项目中使用防抖节流技巧
  • 快速排序(Java)
  • 在ffmpeg中,如何把h264转换为rgb格式
  • 【重磅】Cookies、headers、Session规律总结,搞定卡点
  • 【雷达原理】雷达杂波抑制方法
  • Python-敲木鱼升级版(真手动版敲木鱼)
  • Websocket @ServerEndpoint不能注入@Autowired
  • Unity热更新
  • 如何用维格云搭建和一键训练你的钧瓷AI机器人?
  • 整理的一些Java细节问题
  • 初识AUTOSAR网络管理
  • Flink SQL Hive Connector使用场景
  • 【Docker】联合探讨Docker:容器化技术的革命性应用
  • dirhunt使用手册,中文版
  • 【从0到1设计一个网关】如何设计一个稳定的网关?
  • chromedp库编写程序
  • pngquant failed to build, make sure that libpng-dev is installed 问题
  • 进程控制(二):进程等待