牛客:链表的回文结构

该文介绍了一个利用快慢指针找到链表中间节点,然后反转后半部分链表,再逐一对比前半部分和反转后的后半部分来判断链表是否为回文结构的算法。方法的时间复杂度为O(n),额外空间复杂度为O(1),适用于解决链表回文问题。
摘要由CSDN通过智能技术生成

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

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

测试样例:
1->2->2->1
返回:true

思路:将链表中间之后的部分逆置,然后比较前后两段是否相同。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
    //找中间节点的函数
    struct ListNode* middleNode(struct ListNode* head){
    //定义快慢指针二倍速度差。
    struct ListNode* slow ,*fast; 
    slow = fast = head;
    while(fast && fast->next)
    {
        fast = (fast->next)->next;
        slow = slow->next;
    }
    return slow;
}
    //反转链表的函数
    struct ListNode* reverseList(struct ListNode* head){  
    //直接反向链接并输出。
    if(head==NULL)
    {
        return head;
    }
    struct ListNode* pre = NULL;
    struct ListNode* cur = head;
    struct ListNode* nex = cur->next;

    while(cur)
    {
        cur->next = pre;
        pre = cur;
        cur = nex;
        if(nex != NULL)
        {
            nex = nex->next;
        }
    }
    return pre;
}
    bool chkPalindrome(ListNode* A) {
        // write code here
        struct ListNode* middle = middleNode(A);
        struct ListNode* rhead = reverseList(middle);
        while(A && rhead)
        {
            if((A->val) != (rhead->val))
            {
                 return false;
            }
            else
            {
                A = A->next;
                rhead = rhead->next;
            }
        }
        return true;
    }
};
leetcode 234.回文链表
```cpp
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

     //找中间节点的函数
    struct ListNode* middleNode(struct ListNode* head){
    //定义快慢指针二倍速度差。
    struct ListNode* slow ,*fast; 
    slow = fast = head;
    while(fast && fast->next)
    {
        fast = (fast->next)->next;
        slow = slow->next;
    }
    return slow;
}
    //反转链表的函数
    struct ListNode* reverseList(struct ListNode* head){  
    //直接反向链接并输出。
    if(head==NULL)
    {
        return head;
    }
    struct ListNode* pre = NULL;
    struct ListNode* cur = head;
    struct ListNode* nex = cur->next;

    while(cur)
    {
        cur->next = pre;
        pre = cur;
        cur = nex;
        if(nex != NULL)
        {
            nex = nex->next;
        }
    }
    return pre;
}

bool isPalindrome(struct ListNode* head){
        struct ListNode* middle = middleNode(head);
        struct ListNode* rhead = reverseList(middle);
        while(head && rhead)
        {
            if((head->val) != (rhead->val))
            {
                 return false;
            }
            else
            {
                head = head->next;
                rhead = rhead->next;
            }
        }
        return true;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lihongli000

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值