😈博客主页:🐼大家好我叫张同学🐼
💖 欢迎点赞 👍 收藏 💗留言 📝 欢迎讨论! 👀
🎵本文由 【大家好我叫张同学】 原创,首发于 CSDN 🌟🌟🌟
✨精品专栏(不定时更新) 【数据结构+算法】 【做题笔记】【C语言编程学习】
☀️ 精品文章推荐
【C语言进阶学习笔记】三、字符串函数详解(1)(爆肝吐血整理,建议收藏!!!)
【C语言基础学习笔记】+【C语言进阶学习笔记】总结篇(坚持才有收获!)
前言 |
为什么要写
刷题笔记
?
写博客
的过程也是对自己刷题过程的梳理
和总结
,是一种耗时
但有效
的方法。
当自己分享的博客帮助到他人时,又会给自己带来额外的快乐和幸福。
(刷题的快乐+博客的快乐,简直是奖励翻倍,快乐翻倍
有木有QAQ🙈)
题目内容 |
给你一个单链表的头节点
head
,请你判断该链表是否为回文链表
。
如果是
,返回true
;否则,返回false
。
思路分析 |
回文结构
从前往后数和从后往前数均相同
从前往后:1 2 2 1
从后往前:1 2 2 1
具有对称性的链表就具有回文结构
如果是单数个结点,中间的结点无需考虑,如果其他结点对称肯定是回文结构
例如:1 2 3 1 2 也是回文结构
这里借助求链表倒数第k个结点的思路。
只要链表的
第1个结点=倒数第1个结点
第2个结点=倒数第2个结点
…
一直走到中间结点为止,都相同的话,就是回文结构。否则,就不是回文结构。
循环结束的进行/终止条件有很多,因为我们事先要求出链表的长度。
所以可以通过循环的步数:
step <= 2/length
当然,也可以根据第k个和倒数第k个之间的关系:k <= length-k-1
此外,还可以通过结点指针的关系:cur->next != end || cur != end
函数实现 |
bool isPalindrome(struct ListNode* head){
struct ListNode* tail = head;
int length = 0;//求链表长度
while(tail){
tail = tail->next;
length++;
}
int k = 1;//顺数第k个,从1开始
struct ListNode* cur = head,*end;
while(k <= length-k){
//倒数第k个就是顺序第length-k个
end = head;
for(int i = 0; i < length-k; i++){
end = end->next;//通