经典链表题-链表回文结构

2024-05-26 15:28
文章标签 链表 经典 回文结构

本文主要是介绍经典链表题-链表回文结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

🎉🎉🎉欢迎莅临我的博客空间,我是池央,一个对C++和数据结构怀有无限热忱的探索者。🙌

🌸🌸🌸这里是我分享C/C++编程、数据结构应用的乐园✨

🎈🎈🎈期待与你一同在编程的海洋中遨游,探索未知的技术奥秘💞

📝专栏指路:

📘【C++】专栏:深入解析C++的奥秘,分享编程技巧与实践。

📘【数据结构】专栏:探索数据结构的魅力,助你提升编程能力。

链表的回文结构

温馨小提示:点击即可做题

题目:

9b2ec20c11844f5489e8e12c51a7a07f.png

画图分析:

47922433f88549ada8e98ec4b63e51f3.png

题目思路分析:

1.先找出中间节点

链表的中间节点(点击即可做题)找中间节点力扣上直接有这个题目,我们以此来分析思路

1347c78dc94e40c485214cc9fbea015b.png

解决思路:快慢指针

快指针走两步,慢指针走一步

奇数个节点快指针的next指针为空时,慢指针刚好走到链表的中间节点

偶数个节点快指针为空时,慢指针刚好走到链表的中间节点

65e1c6b5af5b4dcc96c03e0c462f2295.png

代码实现

/*** 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;while(fast&&fast->next)//不可以换位置,在链表节点偶数个结束循环是fast==NULL,//交换位置会对空指针解引用{slow=slow->next;fast=fast->next->next;}return slow;
}

2.反转链表

反转链表(点击即可做题)找中间节点力扣上直接有这个题目,我们以此来分析思路

c05058c489fc428da6b988732539cd01.png

解决思路:迭代

假设链表为 1→2→3→∅我们想要把它改成 ∅←1←2←3

我们需要定义三个指针

一个指针初始化为空

一个指针指向原链表的头结点

一个指针指向原链表头结点的next指针指向的节点

代码实现


struct ListNode*reverse(struct ListNode*head)
{if(head==nullptr||head->next==nullptr)//只有一个节点或链表为空{return head;}struct ListNode*n1,*n2,*n3;n1=nullptr;n2=head;n3=n2->next;//保存当前节点的next指针while(n2){n2->next=n1;//当前节点的next指针指向前一个节点n1=n2;n2=n3;if(n3)//n3最先为空此时n2还没有为空没有出循环,不能对空指针n3解引用n3=n3->next;}return n1;
};

最后我们来实现一下

链表回文结构的代码

// typedef struct ListNode ListNode;
// struct ListNode {
//     int val;
//     struct ListNode* next;
//     ListNode(int x) : val(x), next(NULL) {}
// };//寻找中间节点,快慢指针
struct ListNode*middleNode(struct ListNode*head)
{struct ListNode*fast,*slow;fast=head;slow=head;while(fast&&fast->next){slow=slow->next;fast=fast->next->next;}return slow;};
//翻转链表
struct ListNode*reverse(struct ListNode*head)
{if(head==nullptr||head->next==nullptr)//只有一个节点或链表为空{return head;}struct ListNode*n1,*n2,*n3;n1=nullptr;n2=head;n3=n2->next;while(n2){n2->next=n1;n1=n2;n2=n3;if(n3)//n3最先为空此时n2还没有为空没有出循环,不能对空指针n3解引用n3=n3->next;}return n1;
};class PalindromeList {public:bool chkPalindrome(ListNode* A) {struct ListNode*mid=middleNode(A);struct ListNode*rmid=reverse(mid);while(A&&rmid){if(A->val!=rmid->val){return false;}A=A->next;rmid=rmid->next;}return true;}
};

持续更新中...

敬请期待

这篇关于经典链表题-链表回文结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1004854

相关文章

csu1329(双向链表)

题意:给n个盒子,编号为1到n,四个操作:1、将x盒子移到y的左边;2、将x盒子移到y的右边;3、交换x和y盒子的位置;4、将所有的盒子反过来放。 思路分析:用双向链表解决。每个操作的时间复杂度为O(1),用数组来模拟链表,下面的代码是参考刘老师的标程写的。 代码如下: #include<iostream>#include<algorithm>#include<stdio.h>#

深入手撕链表

链表 分类概念单链表增尾插头插插入 删尾删头删删除 查完整实现带头不带头 双向链表初始化增尾插头插插入 删查完整代码 数组 分类 #mermaid-svg-qKD178fTiiaYeKjl {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-

建立升序链表

题目1181:遍历链表 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2744 解决:1186 题目描述: 建立一个升序链表并遍历输出。 输入: 输入的每个案例中第一行包括1个整数:n(1<=n<=1000),接下来的一行包括n个整数。 输出: 可能有多组测试数据,对于每组数据, 将n个整数建立升序链表,之后遍历链表并输出。 样例输

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟)

【每日一题】LeetCode 2181.合并零之间的节点(链表、模拟) 题目描述 给定一个链表,链表中的每个节点代表一个整数。链表中的整数由 0 分隔开,表示不同的区间。链表的开始和结束节点的值都为 0。任务是将每两个相邻的 0 之间的所有节点合并成一个节点,新节点的值为原区间内所有节点值的和。合并后,需要移除所有的 0,并返回修改后的链表头节点。 思路分析 初始化:创建一个虚拟头节点

HotSpot虚拟机的经典垃圾收集器

读《深入理解Java虚拟机》第三版笔记。 关系 Serial、ParNew、Parallel Scavenge、Parallel Old、Serial Old(MSC)、Concurrent Mark Sweep (CMS)、Garbage First(G1)收集器。 如图: 1、Serial 和 Serial Old 收集器 2、ParNew 收集器 3、Parallel Sc

学习记录:js算法(二十八):删除排序链表中的重复元素、删除排序链表中的重复元素II

文章目录 删除排序链表中的重复元素我的思路解法一:循环解法二:递归 网上思路 删除排序链表中的重复元素 II我的思路网上思路 总结 删除排序链表中的重复元素 给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 图一 图二 示例 1:(图一)输入:head = [1,1,2]输出:[1,2]示例 2:(图

STL经典案例(四)——实验室预约综合管理系统(项目涉及知识点很全面,内容有点多,耐心看完会有收获的!)

项目干货满满,内容有点过多,看起来可能会有点卡。系统提示读完超过俩小时,建议分多篇发布,我觉得分篇就不完整了,失去了这个项目的灵魂 一、需求分析 高校实验室预约管理系统包括三种不同身份:管理员、实验室教师、学生 管理员:给学生和实验室教师创建账号并分发 实验室教师:审核学生的预约申请 学生:申请使用实验室 高校实验室包括:超景深实验室(可容纳10人)、大数据实验室(可容纳20人)、物联网实验

【数据结构与算法 | 灵神题单 | 删除链表篇】力扣3217, 82, 237

总结,删除链表节点问题使用到列表,哈希表,递归比较容易超时,我觉得使用计数排序比较稳,处理起来也不是很难。 1. 力扣3217:从链表中移除在数组中的节点 1.1 题目: 给你一个整数数组 nums 和一个链表的头节点 head。从链表中移除所有存在于 nums 中的节点后,返回修改后的链表的头节点。 示例 1: 输入: nums = [1,2,3], head = [1,2,3,

c++ 链表详细介绍

链表是数据结构的一种,由节点组成,每个节点包含数据和指向下一个节点的指针。链表在C++中的实现可以是单链表、双链表或循环链表。以下是链表的详细介绍: 1. 单链表 结构: 节点(Node):每个节点包含数据和一个指针(next),指向链表中的下一个节点。 示例结构: struct Node {int data;Node* next;Node(int d) : data(d), next(

嵌入式面试经典30问:二

1. 嵌入式系统中,如何选择合适的微控制器或微处理器? 在嵌入式系统中选择合适的微控制器(MCU)或微处理器(MPU)时,需要考虑多个因素以确保所选组件能够满足项目的具体需求。以下是一些关键步骤和考虑因素: 1.1 确定项目需求 性能要求:根据项目的复杂度、处理速度和数据吞吐量等要求,确定所需的处理器性能。功耗:评估系统的功耗需求,选择低功耗的MCU或MPU以延长电池寿命或减少能源消耗。成本