题目描述
回文结构大家应该已经可以很熟悉了~~~,就是从前到后读和从后到前读是一样的,对于连续空间存放的数据来说(数组),我们可以同时从前往后遍历以及从后往前遍历,比较对应位置的元素即可~,但是单链表的特点是无法直接倒着遍历,所以我们采取一种新的思路:
思路:
①找到中间节点
②把链表的后半部分(中间节点到尾节点)进行逆置
③一个指针从头开始走,另一个指针从中间节点开始走,依次比较对应节点是否相等
其中前两步我们之前的链表题目均已讲解,这里就不赘述了
逻辑示意图:
完整代码
struct ListNode* middleList(struct ListNode* head)
{
if(head == NULL)
return NULL;
struct ListNode* fast = head;
struct ListNode* slow = head;
while(fast && fast->next)
{
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
struct ListNode* reverseList(struct ListNode* head)
{
if(head == NULL)
return NULL;
struct ListNode* n1 = NULL;
struct ListNode* n2 = head;
struct ListNode* n3 = head->next;
while(n2)
{
n2->next = n1;
n1 = n2;
n2 = n3;
if(n3)
n3 = n3->next;
}
return n1;
}
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
struct ListNode* mid = middleList(A);
struct ListNode* rhead = reverseList(mid);
while(rhead)
{
if(rhead->val != A->val)
{
return false;
}
else
{
rhead = rhead->next;
A = A->next;
}
}
return true;
}
};
这道题关键就是对前两步的实现,大家要对链表的逆置和找中间节点函数的实现熟练掌握哦~
本篇博客就分享到这啦,欢迎大家交流指正~