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

Day14(链表)——LeetCode234.回文链表141.环形链表

1前言

  这几天脑子真转不动,本想刷点简单题养养脑子,结果发现简单题也想不到,只是看答案好理解了。。。

2 LeetCode234.回文链表(LeetCode234)

2.1 题目描述

  即判断链表是否为回文链表,回文链表即链表的数值正向遍历与反向遍历结果一致。具体示例如下:
1

2.2 问题分析与解决

  简单的思路就是遍历链表,将链表的值放入数组中判断,但是这样需要 O ( n ) O(n) O(n)的空间。如果使用 O ( 1 ) O(1) O(1)的空间和 O ( n ) O(n) O(n)的时间如何解决?
  一个思路可以用两个指针分别从头尾遍历,但是单向链表无法逆向遍历,因此该思路行不通。观察回文链表,可以发现其关于中间对称,因此我们可以先找到中间的节点,判断中间节点分成的两部分是否对称,由于我们仍无法逆序遍历中间前半部分,因此需要将中间后半部分反转,判断其与中间前半部分是否相同即可。
  因此我们的思路是,对于 n n n个节点的链表,先找到第 ⌊ n 2 ⌋ \lfloor\frac{n}{2}\rfloor 2n个节点:
  可以定义两个指针,一个一次走一步(慢指针),一个一次走两步(快指针),当快指针走到最后时,慢指针正好走到中间。
  然后将中间后面的链表进行反转,使用头插法即可,然后遍历反转的链表和原链表的前半部分,看二者是否对应相等即可。
  具体代码如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution {
public:bool isPalindrome(ListNode* head) {//找到中间节点ListNode* fast=head,* slow=head;while(fast!=NULL&&fast->next!=NULL){fast=fast->next->next;slow=slow->next;}//反转ListNode* newhead=NULL,*tmp=slow;while(tmp!=NULL){ListNode* tmp1=tmp->next;tmp->next=newhead;newhead=tmp;tmp=tmp1;}//判断是否是回文链表while(newhead!=NULL){if(head->val!=newhead->val) return false;head=head->next;newhead=newhead->next;}return true;}
};

3 LeetCode141.环形链表

3.1 题目描述

  即判断链表是否包含环。具体描述与示例如下:
2

3.2 问题分析与解决

  一个简单的思路是遍历链表,记录每个节点出现的次数,若某个节点出现两次则判断有环,否则判断无环。但这样需要 O ( n ) O(n) O(n)的空间(哈希表)。我们仍需思考如何使用 O ( 1 ) O(1) O(1)的时间来解决。
  受上述快慢指针影响,仍可以定义上述的快慢指针,若链表有环,则快指针肯定会“套圈”慢指针,即快指针与慢指针指向同一个节点;若无环,则快指针先遍历结束。
  根据这个思路很容易实现代码:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode(int x) : val(x), next(NULL) {}* };*/
class Solution {
public:bool hasCycle(ListNode *head) {ListNode* fast=head,* slow=head;while(fast!=NULL&&fast->next!=NULL){fast=fast->next->next;slow=slow->next;if(slow==fast) return true;}return false;}
};
http://www.xdnf.cn/news/2601.html

相关文章:

  • 探针台在光电行业的应用
  • 徽客松S1 | 合肥首场 AI 黑客松招募
  • 今日头条安卓版新闻推荐精准度与广告影响测评
  • Python3:Jupyter Notebook 安装和配置
  • 详实的ADC检测电路计算
  • Zabbix 7.0下postgresql 16.6数据库监控配置
  • UI 设计之色彩三色搭配原则:打造和谐视觉体验
  • ubuntu安装git及使用(本地git)
  • 高校毕业论文管理系统小程序实现
  • ASCII字符编码标准及字符表
  • ipa包安装到apple手机上
  • DuckDB:现代数据分析的“SQLite“内核革命
  • 树莓派学习专题<11>:使用V4L2驱动获取摄像头数据--启动/停止数据流,数据捕获,缓存释放
  • Kaamel白皮书:2025版COPPA落地实操指南
  • ASP.NET8.0入门与实战
  • OpenStack私有云详细介绍
  • Go语言手搓协程池
  • 11前端项目总结----详情页放大镜和轮播图
  • 基于STM32、HAL库的HX711模数转换器ADC驱动程序设计
  • TV Launcher汉化版下载-TV Launcher启动器极简pro下载
  • 【Misc】PNG宽高修改 - PNG图片宽高CRC爆破
  • 消息中间件
  • 传统行业的数字化转型:如何通过RTMP推流技术提升实时直播体验
  • Spring MVC 请求映射处理:@RequestMapping 与 @Pathvariable
  • H5实现一个二维码生成器页面
  • 华为OD机试真题——阿里巴巴找黄金宝箱Ⅰ(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • MySQL 存储引擎与服务体系深度解析
  • 登高架设作业指的是什么?有什么安全操作规程?
  • 基于QT(C++)实现数字图像处理—Canny边缘检测
  • 【WEB3】web3.0是什么