链表OJ(五)判断一个链表是否为回文结构(中点位置的细节剖析)

描述

给定一个链表,请判断该链表是否为回文结构。

回文是指该字符串正序逆序完全一致。

【解法一】使用一个数组空间,承载这个链表中的元素值。利用双指针进行判断

【解法二】利用快慢指针求链表中点位置,将中点后续位置全部反转,然后利用左右俩端向内侧遍历访问。

开始我是利用一个哑结点来确定最终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;
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_66151870/article/details/129104920
今日推荐