回文链表(双指针法)

回文链表(双指针法)

LeetCode234
题目描述:
在这里插入图片描述
这道题很容易想到一种方法:将整条链表反转和原先的链表进行比较,如果每个节点都一样,说明这个链表是回文链表。但是事先需要对原链表进行复制操作。

下面介绍一种快慢指针的方法,定义一个快指针和一个慢指针,快指针每次走两步,慢指针每次走一步,当快指针走到链表尾部的时候,慢指针就来到了链表的中心。注意链表长度是奇数和偶数存在不同的情况,如下图链表长度为偶数,则快指针为空时,慢指针到达中心位置:
在这里插入图片描述
而链表长度为奇数时,快指针的下一个节点为空时,慢指针来到中心位置,但是反转链表要从下一个节点开始。
在这里插入图片描述
链表的反转有迭代法和递归法,详见https://blog.youkuaiyun.com/Trista__/article/details/116609875?spm=1001.2014.3001.5501
下面上代码:

class Solution {
    public boolean isPalindrome(ListNode head) {
        if(head == null) return false;
        if(head.next == null) return true;
         //快慢指针法判断回文链表
        ListNode slow = head;
        ListNode fast = head;
        while (fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
        }
        //这个时候slow就是中间的节点
        //如果fast没有指向空,说明链表长度是奇数
        if (fast != null){
            slow = slow.next;
        }
        //反转后半部分链表,与前面一半比较
        ListNode last = reverse(slow);
        while (last != null){
            if (last.val != head.val) return false;
            last = last.next;
            head = head.next;
        }
        return true;
    }

    //反转链表
    public static ListNode reverse(ListNode head){
        ListNode pre = null;
        ListNode cur = head;
        while (cur != null){
            ListNode next = cur.next;
            cur.next = pre;
            pre = cur;
            cur = next;
        }
        return pre;
    }
}
<think> 首先,用户的问题是:“我想了解回文链表的定义 请问回文链表的定义”。用户想知道回文链表的定义。 从系统级指令中,我需要: - 所有行内数学表达式使用$...$格式。 - 独立公式使用$$...$$格式并单独成段。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 此外,用户提供了站内引用,我需要参考这些引用来回答。引用包括: - 引用[1]: 提到回文链表题目。 - 引用[2]: 提供递归反转链表判断回文链表的Python代码。 - 引用[3]: 讨论解决回文链表问题的多种方法,包括双指针法和递归法。 - 引用[4]: 展示用Java判断回文链表的代码。 用户说这些引用仅供参考,并不是用户真正的需求。用户上一次的问题是关于回文链表的定义,所以我应该专注于定义。 回文链表的定义:回文链表是指一个链表中的节点值序列是回文的,即从前往后读和从后往前读都一样。例如,链表1->2->3->2->1是一个回文链表。 在我的回答中,我需要在回答中引用的段落末尾添加引用标识。既然用户提供了引用,我应该尽量参考这些引用中的信息。 从引用[3]中:“解决"回文链表"问题”,它描述了回文链表问题,但没有直接给出定义。引用中提到了方法,但定义是隐含的。 我应该从引用中提取信息:引用[3]说“目的:判断链表是否是回文”,表明回文链表是指节点值序列对称。 同样,引用[2]的代码是判断回文链表的。 为了回答定义: - 结构化地回答:清晰定义。 - 使用中文。 - 生成相关问题。 回答结构: 1. **定义部分**:解释什么是回文链表。使用简单语言。 - 例如:回文链表是指链表的节点值序列从前往后读和从后往前读完全相同。 - 如果有数学表达式,比如序列对称,但这里可能不需要LaTeX,因为定义是概念性的。 2. **参考引用**:自然地添加引用标识。例如,在解释中提到参考了某个引用。 3. **生成相关问题**:在末尾生成几个相关问题。 从用户的上一次问题,用户只问了定义,所以我的回答应该详细但专注。 生成相关问题: - 例如: 1. 如何判断一个链表是否是回文链表? 2. 判断回文链表的常见方法有哪些? 3. 回文链表问题在实际应用中的例子? 基于引用,引用[2]、[3]、[4]都讨论了判断方法,所以相关问题可以基于此。 最后,确保LaTeX正确。在本回答中,可能需要用数学格式表示序列,但链表定义可能不需要复杂数学。如果需要,用$...$表示序列,比如序列$a_1, a_2, \dots, a_n$是回文如果$a_i = a_{n-i+1}$ for all i。 是的,那可以是独立公式。 定义回文链表: 一个链表回文的,如果它的节点值序列满足序列是回文的,即对于序列$s_1, s_2, \dots, s_n$,有$s_i = s_{n-i+1}$ for all $i = 1, 2, \dots, n$。 这可以写成独立公式。 在回答中: - 开头解释定义。 - 然后可能简要提及判断方法作为上下文,但用户只问了定义,所以保持核心。 - 结束时生成相关问题。 添加引用:在提到方法时参考引用。 例如:"如引用[3]所述,判断回文链表可以使用双指针法或递归方法。" 但用户问题是定义,所以我应该直接回答定义,然后在生成相关问题中链接到方法。 系统指令说"回答中引用的段落末尾自然地添加引用标识",所以如果我引用了某个部分,加引用。 计划回答: 1. **定义回文链表**: - 回文链表是指一个链表的节点值序列从前往后读和从后往前读完全一致。也就是说,链表序列是回文字符串的数值等价物。 - 独立公式:对于一个链表节点序列,记值序列为$a_1, a_2, \dots, a_n$。该链表回文的,当且仅当对所有$i$,有$a_i = a_{n-i+1}$。 2. **简要解释**:为了使回答有用,可以稍作扩展,提到判断方法,但标注引用。 - 例如:"判断一个链表是否是回文链表有多种方法,如双指针法或递归反转法[^2][^3]。" 3. **生成相关问题**:在末尾添加。 相关问题: - 如何高效地判断一个链表是否是回文链表? - 回文链表判断的时间复杂度是多少? - 有哪些优化方法用于判断回文链表? 基于引用。 完整回答结构: - 定义部分。 - 可能示例。 - 相关问题。 </think> ### 回文链表的定义 回文链表是指一个链表的节点值序列(即从头节点到尾节点读取的值)具有对称性,即序列从前往后读和从后往前读完全相同。换句话说,链表的值序列满足回文性质:序列的第一个值等于最后一个值,第二个值等于倒数第二个值,依此类推。 数学上,假设链表有$n$个节点,节点值序列记为$a_1, a_2, \dots, a_n$(其中$a_i$表示第$i$个节点的值)。该链表回文的,当且仅当对于任意$i \in \{1, 2, \dots, n\}$,都有以下等式成立: $$ a_i = a_{n-i+1} $$ 例如,链表$1 \to 2 \to 3 \to 2 \to 1$的值序列是$1, 2, 3, 2, 1$,它满足上述条件(即$1=1$、$2=2$、$3=3$等),因此是一个回文链表。反之,链表$1 \to 2 \to 3$不是回文的,因为值序列$1, 2, 3$不满足对称性($1 \neq 3$)[^3]。 这种定义强调了序列的对称性,而不改变链表本身的结构(如节点链接关系)。判断回文链表时,需要遍历链表并比较值序列,常见方法包括双指针法或递归反转法,这些方法在算法实现中广泛使用[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值