原题链接: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;}
};