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

单链表专题---暴力算法美学(1)(有视频演示)

1.1 移除链表元素

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

思路一:遍历链表,遇到val就删除,pcur指向val的下一个节点,最后只剩下没有val的链表。

思路二:创建新的链表,头节点用newHead,尾插newTail,pcur来遍历原链表,当pcur!=val,就把数值拿下来,尾插到newTail中,最后新的链表中没有val。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val)//指向头节点的指针,要删除的数值
{//创建一个新链表ListNode* newHead, *newTail;newHead = newTail = NULL;//遍历原链表ListNode* pcur = head;while (pcur)//pcur!=NULL{//找值不为val的节点,尾插到新链表中if (pcur->val != val){//当链表为空时if (newHead == NULL){newHead = newTail = pcur;}else//链表不为空{newTail->next = pcur;//将pcur的值插入newTail的下一个节点newTail = newTail->next;//最后让newTail走向下一个节点}pcur = pcur->next;}}if (newTail)//newTail!=NULLnewTail->next = NULL;return newHead;
}

1.2 反转链表

思路一:创建新的链表,将原链表中的节点拿过来头插。

思路二:创建三个指针,完成链表的翻转。

//反转链表
/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) {//判断链表是否为空if(head==NULL)return head;ListNode* n1,*n2,*n3;//创建三个指针实现反转//介绍三个指针分别在什么地方n1 = NULL, n2 = head, n3 = n2->next;while(n2)//判断结束节点,n2!=NULL{n2->next=n1;n1=n2;n2=n3;if(n3)n3=n3->next;}return n1;//n1是链表新的头节点
}

反转链表算法题思路

1.3 链表的中间节点

思路一:遍历原链表,count计节点数,直接返回(count / 2)节点的next节点

思路二:快慢指针

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {//创建两个指针ListNode* fast,* slow;fast=head;slow=head;//两个创建的指针都指向head头节点while(fast && fast->next)//偶数链表遍历结束条件fast=NULL,奇数链表遍历结束条件fast->next=NULL{slow=slow->next;fast=fast->next->next;}return slow;
}

问题:while(fast->next && fast)可以交换位置吗?

不可以!若链表有偶数个节点的情况下,fast最后一次会直接走到空,fast->next会执行报错!

链表的中间节点的思路二:快慢指针

1.3.1拓展提升:删除链表的中间节点

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* deleteMiddle(struct ListNode* head) {struct ListNode* slow, *fast, *dummy, *tmp;dummy=(struct ListNode*)malloc(sizeof( ListNode));dummy->next=head;slow = fast = dummy;while(fast->next != NULL && fast->next->next != NULL) {slow = slow->next;fast = fast->next->next;}tmp = slow->next;slow->next = tmp->next;free(tmp);return dummy->next;
}

问题:为什么要额外申请一个空间放置dummy,dummy->next=head,头节点head本身就是存在的,为什么要有一个dummy来指向head?

答: dummy(虚拟头节点)使用来简化边界情况处理的“工具人”。如果链表只有一个节点,这个唯一节点就是“中间节点”,需要被删除,如果没有dummy,直接删除head,结果会返回NULL,而dummy->next永远指向实际链表的头节点,不管头节点有没有被删除,最后返回的都是dummy->next,不用单独处理头节点被删除导致head无效的情况。

删除链表的中间元素解题思路

http://www.xdnf.cn/news/1256743.html

相关文章:

  • 【性能测试】---测试工具篇(jmeter)
  • 超声波自动气象站如何精准预警极端天气
  • 深入解析 Dash 中的 dcc.Checklist:构建高效多选交互界面
  • 【LeetCode】set和map相关算法题 前K个高频单词、随机链表的复制、两个数组的交集、环形链表
  • 视觉语言模型的空间推理缺陷——AI 在医学扫描中难以区分左右
  • 生成式AI时代,Data+AI下一代数智平台建设指南
  • 8.3.1 注册服务中心Etcd
  • 商城小程序怎么做?如何开发母婴用品商城小程序?
  • [C++20]协程:语义、调度与异步 | Reactor 模式
  • NVIDIA/k8s-device-plugin仓库中GPU无法识别问题的issues分析报告
  • LoRaWAN的网络拓扑
  • mapbox进阶,mapbox-gl-draw绘图插件扩展,绘制新增、编辑模式支持点、线、面的捕捉
  • 【已解决】-bash: mvn: command not found
  • PyTorch LSTM文本生成
  • 专题:2025财务转型与AI赋能数字化报告|附30+份报告PDF汇总下载
  • Casrel关系抽取
  • 【2025最新】在 macOS 上构建 Flutter iOS 应用
  • 关于时钟门控ICG的一切(与门及或门门控)
  • 紫光同创Logos2+RK3568JHF开发板:国产异构计算平台的破局者
  • Mongodb常用命令简介
  • 将Excel数据导入SQL Server数据库,并更新源表数据
  • 超全的软件测试项目平台,10多个项目部署在线上环境,浏览器直接访问
  • 树莓派安装OpenCV环境
  • 8、Redis的HyperLogLog、事务Multi、管道Pipeline,以及Redis7.0特性
  • STM32 HAL库外设编程学习笔记
  • iOS 文件管理实战指南,用户文件、安全访问与开发调试方案
  • npm 与 npx 区别详解。以及mcp中npx加载原理。
  • 多线程 future.get()的线程阻塞是什么意思?
  • [无需 Mac] 使用 GitHub Actions 构建 iOS 应用
  • 全栈:如何操作在SQLserver里面CRUD(增删改查)