【Golang】LeetCode 234. 回文链表

234. 回文链表

题目描述

思路

想要判断一个单链表是否是回文链表其实很简单,我们只需要将其以中间节点为界限分为两部分,翻转后面一部分,再从头开始比对两个链表的值Val是否相同,如果完全相同那么就是回文链表,否则就不是回文链表。

为了实现这个目标,我们需要借助两个思想,分别是判断"环状链表"时用到的"快慢指针"以及链表翻转的模版。

首先我们使用快慢指针找到链表的中间位置,即快指针为nil时慢指针指向的节点;然后,我们翻转慢指针到尾部这一段链表;最后,我们从头开始比对这两段链表,如果值完全相同则最后返回true;否则,中途返回false即可。

基于以上思路,我们写代码来解决这道题。

Golang 题解

go 复制代码
/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseList(head, tail *ListNode) *ListNode {
    curr, prev := head, tail
    for curr != tail {
        next := curr.Next
        curr.Next = prev
        prev = curr
        curr = next
    }
    return prev
}

func isPalindrome(head *ListNode) bool {
    slow, fast := head, head
    for fast != nil {
        slow = slow.Next
        fast = fast.Next
        if fast != nil {
            fast = fast.Next
        }
    }

    slow, fast = reverseList(slow, nil), head
    for slow != nil {
        if slow.Val != fast.Val {
            return false
        }
        slow, fast = slow.Next, fast.Next
    }

    return true
}
相关推荐
TracyCoder12323 分钟前
LeetCode Hot100(34/100)——98. 验证二叉搜索树
算法·leetcode
Tony Bai1 小时前
再见,丑陋的 container/heap!Go 泛型堆 heap/v2 提案解析
开发语言·后端·golang
We་ct2 小时前
LeetCode 56. 合并区间:区间重叠问题的核心解法与代码解析
前端·算法·leetcode·typescript
念何架构之路4 小时前
Go进阶之panic
开发语言·后端·golang
先跑起来再说4 小时前
Git 入门到实战:一篇搞懂安装、命令、远程仓库与 IDEA 集成
ide·git·后端·elasticsearch·golang·intellij-idea
努力学算法的蒟蒻5 小时前
day79(2.7)——leetcode面试经典150
算法·leetcode·职场和发展
2401_841495645 小时前
【LeetCode刷题】二叉树的层序遍历
数据结构·python·算法·leetcode·二叉树··队列
2401_841495645 小时前
【LeetCode刷题】二叉树的直径
数据结构·python·算法·leetcode·二叉树··递归
我是咸鱼不闲呀5 小时前
力扣Hot100系列19(Java)——[动态规划]总结(上)(爬楼梯,杨辉三角,打家劫舍,完全平方数,零钱兑换)
java·leetcode·动态规划
铉铉这波能秀6 小时前
LeetCode Hot100数据结构背景知识之列表(List)Python2026新版
数据结构·leetcode·list