leetcode234. 回文链表,巧用反转链表

leetcode234. 回文链表

给你一个单链表的头节点 head ,请你判断该链表是否为
回文链表。如果是,返回 true ;否则,返回 false

示例 1:
在这里插入图片描述
输入:head = [1,2,2,1]
输出:true

示例 2:
在这里插入图片描述
输入:head = [1,2]
输出:false

在这里插入图片描述

题目描述

给定一个单链表,编写一个函数判断该链表是否为回文链表。

算法分析

这个问题可以通过快慢指针法来解决。我们首先找到链表的中间节点,然后将链表的后半部分反转。最后,我们比较链表的前半部分和反转后的后半部分是否相同。

算法步骤

  1. 初始化两个指针 slowfast 都指向链表的头节点。
  2. 使用快慢指针法找到链表的中间节点,即 slow 指针指向的位置。
  3. 反转链表的后半部分,使用 reverseList 函数。
  4. 比较链表的前半部分和反转后的后半部分是否相同。
  5. 返回结果。

算法流程

开始
初始化两个指针 slow 和 fast
使用快慢指针法找到链表的中间节点
反转链表的后半部分
比较链表的前半部分和反转后的后半部分
返回结果

具体代码

class Solution {
public:
    ListNode* middleNode(ListNode* head) {
        ListNode* slow = head;
        ListNode* fast = head;
        while (fast && fast->next) {
            slow = slow->next;
            fast = fast->next->next;
        }
        return slow;
    }

    ListNode* reverseList(ListNode* head) {
        ListNode* pre = nullptr;
        ListNode* cur = head;
        while (cur) {
            ListNode* temp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }


    bool isPalindrome(ListNode* head) {
        ListNode* mid = middleNode(head);
        ListNode* head2 = reverseList(mid);

        while (head != mid) {
            if (head->val != head2->val)
                return false;
            head = head->next;
            head2 = head2->next;
        }
        return true;
    }
};

算法分析

复杂度分析

  • 时间复杂度:O(n),其中 n 是链表的长度。我们需要遍历链表一次。
  • 空间复杂度:O(1),我们不需要额外的空间,除了几个指针。

易错点

  • 在使用快慢指针法时,确保正确地找到链表的中间节点。
  • 在反转链表时,确保正确地反转链表的节点。
  • 在比较链表的前半部分和后半部分时,确保正确地比较它们的值。

注意事项

  • 确保在遍历链表时不要超出链表的边界。
  • 在处理链表节点时,确保不会覆盖任何节点。

相似题目

题目链接
链表的中间节点https://leetcode.com/problems/middle-of-the-linked-list/
反转链表https://leetcode.com/problems/reverse-linked-list/
回文链表https://leetcode.com/problems/palindrome-linked-list/
两数之和https://leetcode.com/problems/two-sum/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Cider瞳

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

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

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

打赏作者

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

抵扣说明:

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

余额充值