题目描述
题目链接:链表的回文结构_牛客题霸_牛客网 (nowcoder.com)
题目分析
我们的思路是:
- 找到中间结点
- 逆置后半段
- 比对
我们可以简单画个图来表示一下:
‘
奇数和偶数都是可以的
找中间结点
我们可以用快慢指针来找中:leetcode:链表的中间结点-CSDN博客
写一个找中的函数middleNode:
然后写一个逆置的函数reverseList:
我们画图表示一下头插的过程:
最后我们进行一个对比
代码示例
有了这个思路,我们就可以编写代码了:
/* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), next(NULL) {} };*/ class PalindromeList { public: struct ListNode*reverseList(ListNode*head) { struct ListNode*cur=head; struct ListNode*newhead=NULL; while(cur) { struct ListNode*next=cur->next; //头插 cur->next=newhead; newhead=cur; cur=next; } return newhead; } struct ListNode*middleNode(ListNode*head) { struct ListNode*slow,*fast; slow=fast=head; while(fast&&fast->next) { slow=slow->next; fast=fast->next->next; } return slow; } bool chkPalindrome(ListNode* head) { // write code here struct ListNode*mid=middleNode(head); struct ListNode*rhead=reverseList(mid); while(head&&rhead) { if(head->val!=rhead->val) { return false; } head=head->next; rhead=rhead->next; } return true; } };
结果也就通过了: