【链表OJ题 6】链表的回文结构

简介: 【链表OJ题 6】链表的回文结构

题目来源:

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

题目描述:

本题的难点在于时间复杂度为O(n),空间复杂度为O(1)。

代码实现:

struct ListNode* middleNode(struct ListNode* head)
{
    struct ListNode* fast = head, * slow = head;
    while (fast && fast->next)
        {
            fast = fast->next->next;
            slow = slow->next;
        }
    return slow;
}
struct ListNode* reverse(struct ListNode* head)
{
    struct ListNode* prev = NULL, * cur = head, * next = NULL;
    while (cur)
        {
            //尾插
            next = cur->next;
            cur->next = prev;
            prev = cur;
            //迭代
            cur = next;
        }
    return prev;
}
class PalindromeList {
public:
bool chkPalindrome(ListNode* A) {
    // write code here
    struct ListNode* mid = middleNode(A);
    struct ListNode* rmid = reverse(mid);
    while (rmid)
        {
            if (rmid->val != A->val)
                return false;
            rmid = rmid->next;
            A = A->next;
        }
    return true;
}
};

思路分析:

因为回文结构是正着读反着读是一样的,因此我们找到链表的中间结点,然后从中间节点开始逆置到尾结点,然后用逆置后的链表与原链表的前半段对比,如果每个结点的 val 都相等,就说明此链表是回文结构。


实现过程:

1.使用快慢指针,初始化都指向原链表的头,慢指针一次走一步,快指针一次走两步,快指针走到空或快指针的 next 走到空时,慢指针指向的就是中间结点。


2.找到中间结点后,从中间结点开始到尾结点进行逆置。


这里讲的不够细致,找中间结点与逆置分别是两篇文章,里面讲的比较细致。

找中间结点:http://t.csdn.cn/z3vm5

逆置链表/反转链表:http://t.csdn.cn/Jt38p

我们分别将这两个功能封装成函数使用。


3.以逆置之后的链表头结点作为循环条件(这里其实不难发现逆置后的链表与原链表的长度相等),遍历整个逆置之后的链表,与原链表的 val 对比,如果存在哪个结点的val 不相等就返回 false,如果遍历完整个逆置后的链表都相等就返回 true。


这样的解法可以实现题目的要求:本题的难点在于时间复杂度为O(n),空间复杂度为O(1)。



如果大牛的您看到有什么问题留言给我,我一定会认真看的,谢谢您。如果您看了觉得有收获,关注 + 点赞支持一下呗。

*** 本篇结束 ***

相关文章
|
1月前
|
存储 Java
数据结构第三篇【链表的相关知识点一及在线OJ习题】
数据结构第三篇【链表的相关知识点一及在线OJ习题】
25 7
|
1月前
【数据结构】环形、相交、回文、分割、合并、反转链表
【数据结构】环形、相交、回文、分割、合并、反转链表
27 0
|
4月前
【数据结构OJ题】环形链表
力扣题目——环形链表
37 3
【数据结构OJ题】环形链表
|
3月前
【刷题记录】链表的回文结构
【刷题记录】链表的回文结构
|
4月前
【数据结构OJ题】复制带随机指针的链表
力扣题目——复制带随机指针的链表
51 1
【数据结构OJ题】复制带随机指针的链表
|
4月前
【数据结构OJ题】环形链表II
力扣题目——环形链表II
30 1
【数据结构OJ题】环形链表II
|
4月前
【数据结构OJ题】相交链表
力扣题目——相交链表
32 1
【数据结构OJ题】相交链表
|
3月前
|
存储 Java 开发者
揭秘!HashMap底层结构大起底:从数组到链表,再到红黑树,Java性能优化的秘密武器!
【8月更文挑战第24天】HashMap是Java集合框架中的核心组件,以其高效的键值对存储和快速访问能力广受开发者欢迎。在JDK 1.8及以后版本中,HashMap采用了数组+链表+红黑树的混合结构,实现了高性能的同时解决了哈希冲突问题。数组作为基石确保了快速定位;链表则用于处理哈希冲突;而当链表长度达到一定阈值时,通过转换为红黑树进一步提升性能。此外,HashMap还具备动态扩容机制,当负载因子超过预设值时自动扩大容量并重新哈希,确保整体性能。通过对HashMap底层结构的深入了解,我们可以更好地利用其优势解决实际开发中的问题。
101 0
|
4月前
【数据结构OJ题】链表分割
牛客题目——链表分割
32 0
【数据结构OJ题】链表分割
|
3月前
|
Python
【Leetcode刷题Python】234.回文链表
两种判断链表是否为回文的方法:使用栈和拆分为两个链表后反转对比,并给出了相应的Python代码实现。
22 0