当前位置: 首页 > 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.lqws.cn/news/166105.html

相关文章:

  • 计算机操作系统知识点总结④【完】
  • 2025年渗透测试面试题总结-ali 春招内推电话1面(题目+回答)
  • linux应急响应检查脚本
  • web第十次课后作业--Mybatis的增删改查
  • Java常用工具类方法详解及使用案例
  • ABP VNext 在 Kubernetes 中的零停机蓝绿发布
  • 用 NGINX 构建高效 POP3 代理`ngx_mail_pop3_module`
  • 计算机组成原理(计算篇)
  • 在MATLAB中使用自定义的ROS2消息
  • 本地部署大模型实战:使用AIStarter一键安装Ollama+OpenWeb教程(含最新版本更新指南)
  • 【python深度学习】Day 45 Tensorboard使用介绍
  • 主流消息队列对比
  • 基于protobuf + iceoryx实现共享内存上的零拷贝
  • vue和uniapp聊天页面右侧滚动条自动到底部
  • python执行测试用例,allure报乱码且未成功生成报告
  • 学习路之PHP--webman安装及使用、webman/admin安装
  • Mobile App UI自动化locator
  • Jenkins | Jenkins构建成功服务进程关闭问题
  • Redis数据持久化机制深度解析
  • 从零开始的嵌入式学习day33
  • 【Fifty Project - D33】
  • select、poll、epoll 与 Reactor 模式
  • UI学习—cell的复用和自定义cell
  • linux 串口调试命令 stty
  • SELinux是什么以及如何编写SELinux策略
  • Git操作记录
  • 知识蒸馏:从模型输出到深层理解
  • JAVA开发工具——IntelliJ IDEA
  • 在不同型号的手机或平板上后台运行Aidlux
  • 上门预约行业技术方案全解析:小程序、App还是H5?如何选择?