当前位置: 首页 > news >正文

经典算法:回文链表

题目:234. 回文链表

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

示例 1:

输入:head = [1,2,2,1]
输出:true

示例 2:

输入:head = [1,2]
输出:false

提示:

  • 链表中节点数目在范围[1, 10 5 10^5 105] 内
  • 0 <= Node.val <= 9

进阶: 你能否用 $ O(n) $ 时间复杂度和 $ O(1) $ 空间复杂度解决此题?

解题思路

通过快慢指针找到中点,反转后半部分链表且进行比较。

实现代码

package leetcodeimport ("github.com/superproj/go-leetcode/structure"
)// ListNode define
type ListNode = structure.ListNode/*** Definition for singly-linked list.* type ListNode struct {*     Val int*     Next *ListNode* }*/
func isPalindrome(head *ListNode) bool {if head == nil {return true}// 找出中点,快指针到了链表结尾,慢指针也就到了链表中点mid := findMid(head)// 翻转后半部分链表rev := reverse(mid)// 比对前后链表for rev != nil && head != nil {if head.Val != rev.Val {return false}rev, head = rev.Next, head.Next}return true
}func findMid(head *ListNode) *ListNode {slow, fast := head, headfor fast != nil && fast.Next != nil {slow, fast = slow.Next, fast.Next.Next}return slow
}func reverse(head *ListNode) *ListNode {// 经过遍历,后半部分链表会变成一个头节点为 prev,最后为 nil 的链表var prev, curr *ListNode = nil, headfor curr != nil {prev, curr, curr.Next = curr, curr.Next, prev}return prev
}

单元测试

package leetcodeimport ("testing""github.com/stretchr/testify/assert""github.com/superproj/go-leetcode/structure"
)func Test_isPalindrome(t *testing.T) {assert := assert.New(t)type args struct {first []int}tests := []struct {args argswant bool}{{args: args{[]int{1, 1, 2, 2, 3, 4, 4, 4}},want: false,},{args: args{[]int{1, 1, 1, 1, 1, 1}},want: true,},{args: args{[]int{1, 2, 2, 1, 3}},want: false,},{args: args{[]int{1}},want: true,},{args: args{[]int{}},want: true,},{args: args{[]int{1, 2, 2, 2, 2, 1}},want: true,},{args: args{[]int{1, 2, 2, 3, 3, 3, 3, 2, 2, 1}},want: true,},{args: args{[]int{1, 2}},want: false,},{args: args{[]int{1, 0, 1}},want: true,},{args: args{[]int{1, 1, 2, 1}},want: false,},}for _, tt := range tests {first := structure.Ints2List(tt.args.first)actual := isPalindrome(first)assert.Equal(tt.want, actual)}
}
http://www.dtcms.com/a/233574.html

相关文章:

  • 使用VSCode开发Flask指南
  • Android设置顶部状态栏透明,以及状态栏字体颜色
  • 如何修改项目在浏览器中的小图标
  • OpenWRT prplOS-- ubus命令配置参数
  • Python基于蒙特卡罗方法实现投资组合风险管理的VaR与ES模型项目实战
  • 用WPDRRC模型,构建企业安全防线
  • 防爆对讲机:危险作业场景下的通信守护者
  • 服务器安装软件失败或缺依赖怎么办?
  • Dify应用类型和工作流介绍
  • c++第七天--特殊运算符的重载练习
  • 极昆仑智慧与数元灵科技达成战略合作
  • PHP文件读取漏洞全面剖析:触发点与利用技术
  • IBMS综合运维平台业务分析与BA楼宇自控系统技术架构与应用
  • JS逆向爬虫教程与实战技巧
  • Arduino学习-按键灯
  • 【Linux手册】冯诺依曼体系结构
  • 高效线程安全的单例模式:Python 中的懒加载与自定义初始化参数
  • html-pre标签
  • .Net Framework 4/C# LINQ*
  • MySQL常用知识总结
  • 脑洞大开,将文本存入视频中
  • 【.net core】.KMZ文件解压为.KML文件并解析为GEOJSON坐标数据集。附KML处理多线(LineString)闭环问题
  • PPIO ×Apifox:一键调用模型API,高效开发AI应用
  • AdvancedLivePortrait V2版 - 一张照片生成生动任意表情图片/视频,支持50系显卡 本地一键整合包下载
  • 【教学类】20250605立体纸盘(3边形-22边形,角度5、10……40,45)
  • 知识蒸馏:从模型输出到深层理解
  • 【QQMusic】在LikePage点击取消喜欢没有反应
  • OptiStruct结构分析与工程应用:无限元分析指南
  • graylog收集rsyslog实现搜索解析
  • JS手写代码篇---bind手写