描述
给定一个链表,请判断该链表是否为回文结构。
回文是指该字符串正序逆序完全一致。
【解法一】使用一个数组空间,承载这个链表中的元素值。利用双指针进行判断
【解法二】利用快慢指针求链表中点位置,将中点后续位置全部反转,然后利用左右俩端向内侧遍历访问。
开始我是利用一个哑结点来确定最终slow指针的位置,利用slow开始进行后续反转,最终即为下图
反转之后进行判断
左边为奇数结点个数 偶数结点个数
这里探究了一下有无哑结点的判断
对于奇数结点个数来说,有无哑结点对于中点的查找不影响
对于奇数结点个数来说,有哑结点中点位置偏左,原头结点来找slow在右部分
对于此道题来说,直接使用原结点开始更好一些,可以直接进行反转,但是如果想要进行后半部分的截断,那么使用能够哑结点可以更好处理。
class Solution {
public:
ListNode* reverse(ListNode* head)
{
ListNode* pre = nullptr, *Next = nullptr;
while(head)
{
Next = head->next;
head->next = pre;
pre = head;
head = Next;
}
return pre;
}
bool isPail(ListNode* head) {
if(head == nullptr)return true;
ListNode* slow = head, *fast = head;
while(fast && fast->next)
{
fast = fast->next->next;
slow = slow->next;
}
slow = reverse(slow); // 反转链表并处理返回值(反转后的新链表)
fast = head;
while(slow) // 这里只能使用slow判断
{
if(slow->val != fast->val)
return false;
slow = slow->next;
fast = fast->next;
}
return true;
}
};