链表的回文结构

题目描述

题目链接:链表的回文结构_牛客题霸_牛客网 (nowcoder.com)

链表的回文结构_第1张图片

链表的回文结构_第2张图片

题目分析

我们的思路是:

  • 找到中间结点
  • 逆置后半段
  • 比对

我们可以简单画个图来表示一下:

链表的回文结构_第3张图片 ‘

奇数和偶数都是可以的

找中间结点

我们可以用快慢指针来找中:leetcode:链表的中间结点-CSDN博客

写一个找中的函数middleNode:

链表的回文结构_第4张图片

然后写一个逆置的函数reverseList:

链表的回文结构_第5张图片

我们画图表示一下头插的过程:

链表的回文结构_第6张图片

最后我们进行一个对比

链表的回文结构_第7张图片

代码示例

有了这个思路,我们就可以编写代码了:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
    struct ListNode*reverseList(ListNode*head)
    {
        struct ListNode*cur=head;
        struct ListNode*newhead=NULL;
        while(cur)
        {
            struct ListNode*next=cur->next;
            //头插
            cur->next=newhead;
            newhead=cur;
            cur=next;
        }
        return newhead;
    }
    struct ListNode*middleNode(ListNode*head)
    {
        struct ListNode*slow,*fast;
        slow=fast=head;
        while(fast&&fast->next)
        {
            slow=slow->next;
            fast=fast->next->next;
        }
        return slow;
    }
    bool chkPalindrome(ListNode* head) {
        // write code here
        struct ListNode*mid=middleNode(head);
        struct ListNode*rhead=reverseList(mid);
        while(head&&rhead)
        {
            if(head->val!=rhead->val)
            {
                return false;
            }
            head=head->next;
            rhead=rhead->next;
        }
        return true;

    }
};

结果也就通过了:

链表的回文结构_第8张图片

你可能感兴趣的:(#,刷题,链表,算法,数据结构)