链表的回文结构

该篇博客探讨了如何在O(n)时间和O(1)空间复杂度下判断链表是否为回文结构。首先找到链表的中间节点,然后逆置中间节点之后的部分。接着,同时遍历原始链表头部和逆置后的链表尾部,比较两者节点值,若所有值都相等,则链表为回文结构。提供的代码实现了这一算法。
摘要由CSDN通过智能技术生成

链表的回文结构

描述

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。

给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

image-20211024212302600

思路:

我们可以先找到链表的中间节点然后逆置中间节点后的节点,然后依次遍历head和rHead直到空为止,如果值一直相等则为回文结构

image-20211024212524260

image-20211024212653542

具体代码实现如下:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/

struct ListNode* reverseList(struct ListNode* head){
    if(head == NULL)
        return NULL;
    struct ListNode* prev = NULL;
    struct ListNode* tail = head;
    while(tail)
    {
        tail = head->next;
        head->next = prev;
        prev = head;
        head = tail;
    }
    return prev;
}

struct ListNode* middleNode(struct ListNode* head){
    struct ListNode* fast = head;
    struct ListNode* slow = head;
    while(fast && fast->next)
    {
        fast = fast->next->next;
        slow = slow->next; 
    }
    return slow;
}

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值