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

相关文章:

  • 开发在线问诊APP要注意什么?互联网医院系统源码、功能、合规全详解
  • MATLAB仿真:偏振光在光纤通信中的应用研究_可复现,有问题请联系博主
  • RocketMQ基础概念的理解
  • 28. Revit API:尺寸标注(Dimension)
  • C++STL-vector的使用
  • 非隔离电源方案
  • 【信息系统项目管理师-选择真题】2025上半年(第一批)综合知识答案和详解
  • 【Python训练营打卡】day44 @浙大疏锦行
  • 【PhysUnits】15.15 变量类型(variable.rs)
  • 前端没有“秦始皇“,但可以做跨端的王[特殊字符]
  • 驭码CodeRider 2.0 产品体验 — 搭建邮件服务
  • Web前端之原生表格动态复杂合并行、Vue
  • 农田水利如何「聪明」起来?Modbus转Ethernet IP破解设备互联
  • C语言| 指针在数组中的移动
  • qt ui 转python
  • 三维GIS开发cesium智慧地铁教程(3)entity实体
  • 岩石三轴试验机
  • Spring Boot-面试题(52)
  • 每日算法刷题Day23 6.5:leetcode二分答案3道题,用时1h40min(有点慢)
  • JS深入学习 — 循环、函数、数组、字符串、Date对象,Math对象
  • 前端面试四之Fetch API同步和异步
  • c++算法学习3——深度优先搜索
  • 【java面试】框架篇
  • snprintf函数用法及注意事项详解
  • Redisson简明教程—你家的锁芯该换了
  • 71 LV信息查看
  • DeepSeek私有化部署的理性抉择:谁需要?谁不必?
  • SSH 和 Telnet 介绍、区别与使用方法
  • JAVA-springboot JUnit单元测试
  • Qt实现一个悬浮工具箱源码分享