原题链接:https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa?tpId=49&&tqId=29370&rp=1&ru=/activity/oj&qru=/ta/2016test/question-ranking
目录
1. 题目描述
2. 思路分析
3. 代码实现
1. 题目描述
2. 思路分析
在做这道题之前,我们首先得知道什么是“回文”。
回文就是指正读和反读都相同的字符序列为“回文”,如“abba”、“abccba”、12321、123321是“回文”,“abcde”和“ababab”则不是“回文”。
知道了回文的意思后,我们开始分析题目!
先找到中间结点,然后把后半部分逆置,最后对前后两部分一一比对,如果结点的值全部相同,则即为回文。否则就不是回文。
如果链表是回文结构如下图(左半部分为奇数个结点的情况,右半部分为偶数个结点的情况)
如果有小伙伴不知道怎么求链表的中间结点,可以看看这篇文章:
https://blog.csdn.net/m0_62531913/article/details/132309395?spm=1001.2014.3001.5502
如果有小伙伴不知道怎么将链表逆置,可以看看这篇文章:
https://blog.csdn.net/m0_62531913/article/details/132297310?spm=1001.2014.3001.5502
3. 代码实现
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
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;
}
struct ListNode* reverseList(struct ListNode* head){
struct ListNode *n1,*n2,*n3;
n1=NULL;
n2=head;
if(n2)
n3=n2->next;
while(n2)
{
n2->next=n1;
n1=n2;
n2=n3;
if(n3)
n3=n3->next;
}
return n1;
}
bool chkPalindrome(ListNode* head) {
struct ListNode* mid=middleNode(head);
struct ListNode* rmid=reverseList(mid);
while(head&&rmid)
{
if(head->val!=rmid->val)
{
return false;
}
else
{
head=head->next;
rmid=rmid->next;
}
}
return true;
}
};