欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

链表问题、合并两个有序链表、链表分区、链表的 Palindromes , 链表相交 - OR36 链表的 Palindromes

最编程 2024-10-16 20:42:18
...

题目链接

在这里插入图片描述

思路

我们需要找到传入链表的中间结点,并将中间结点及其后面结点进行反转,然后再将原链表的前半部分与反转后的后半部分进行比较,若相同,则该链表是回文结构,否则,不是回文结构。

1.找到链表的中间结点。

2.反转中间结点及其后面的结点。

3.比较链表的前半部分与后半部分的结点值,若相同则是回文结构,否则,不是回文结构。

在这里插入图片描述
将A指针指向的结点与RHead指针指向的结点进行比较,若相同,则两个指针后移,继续比较后面的结点,直到RHead指针指向NULL时,比较结束。

注意:就算传入的链表是结点数为奇数的回文结构,该思路也可以成功判断。

class PalindromeList {
public:
    //查找链表的中间结点
    ListNode* middleNode(ListNode* head)
    {
        ListNode* fast = head;
        ListNode* slow = head;
        while(fast && fast->next)
        {
            fast = fast->next->next;
            slow = slow->next;
        }

        return slow;
    }


    //反转链表
	ListNode* reverseList(ListNode* head)
    {
        ListNode* newhead = nullptr;
        ListNode* cur = head;
        while(cur)
        {
            ListNode* next = cur->next;
            cur->next = newhead;
            newhead = cur;
            cur = next;
        }

        return newhead;
    }

    bool chkPalindrome(ListNode* A) {
        // write code here
        ListNode* mid = middleNode(A);
        ListNode* head = reverseList(mid);
        while(head)
        {
            if(A->val != head->val)
                return false;
            A = A->next;
            head = head->next;
        }
        return true;
    }
};