判断某一个单链表是否是回文结构,是返回true、不是返回false。
所谓的回文结构,就是类似对称结构:
对于奇数与偶数个结点均是如此。
那么就有思路:①找到链表的中间结点②逆置后半部分或前半部分③比较两者
①找中间结点:
ListNode* slow , *fast;
fast = slow = head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
}
ListNode* mid = slow;
②逆置后半部分
可以使用三指针的方式进行逆置,也可以如上图所示创建一个指针变量midhead来头插。
//三指针逆置
ListNode* mid = slow;
while(mid->next)
{
ListNode* midnext = mid->next;
ListNode* midnextnext = midnext->next;
midnext->next = mid;
mid = midnext;
}
//逆置mid后的链表,采用头插
ListNode* midhead = NULL;
while(mid)
{
ListNode* midnext = mid->next;
mid->next = midhead;
midhead = mid;
mid = midnext;
}
③遍历比较两个链表同位置处的值
while(midhead&&head)
{
if(midhead->val!=head->val)
return false;
midhead=midhead->next;
head=head->next;
}
return true;
整体代码如下:
public:
bool chkPalindrome(ListNode* head) {
ListNode* slow , *fast;
fast = slow = head;
while(fast&&fast->next)
{
fast=fast->next->next;
slow=slow->next;
}
ListNode* mid = slow;
while(mid->next)
{
ListNode* midnext = mid->next;
ListNode* midnextnext = midnext->next;
midnext->next = mid;
mid = midnext;
}
while(mid&&head)
{
if(mid->val!=head->val)
return false;
mid=mid->next;
head=head->next;
}
return true;
}
};