用go构建-回文链表
2026-01-24 11:13 tlnshuju 阅读(0) 评论(0) 收藏 举报目录
题目
算法思路
代码
代码详解
1. 边界处理
2. 快慢指针找中点
3. 反转后半部分链表
4. 比较前后两部分
题目
234. 回文链表
简单
给你一个单链表的头节点 head ,请你判断该链表是否为回文链表。如果是,返回 true ;否则,返回 false 。
示例 1:

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

输入:head = [1,2]
输出:false
提示:
- 链表中节点数目在范围
[1, 105]内 0 <= Node.val <= 9
进阶:你能否用 O(n) 时间复杂度和 O(1) 空间复杂度解决此题?
算法思路
核心思想:反转后半部分链表进行比较
主要步骤:
找到中间节点(使用快慢指针)
慢指针每次走一步,快指针每次走两步
当快指针到达末尾时,慢指针在中间位置
反转后半部分链表
从中间节点开始反转链表后半部分
比较前后两部分
分别从头节点和反转后的后半部分头节点开始比较
逐个节点比较值是否相等
代码
package main
import "fmt"
// 链表节点定义
type ListNode struct {Val intNext *ListNode
}
// 解法:反转后半部分链表(O(1)空间复杂度)
func isPalindrome(head *ListNode) bool {if head == nil || head.Next == nil {return true}// 1. 快慢指针找中点slow, fast := head, headfor fast != nil && fast.Next != nil {slow = slow.Nextfast = fast.Next.Next}// 2. 反转后半部分var prev *ListNodecur := slowfor cur != nil {next := cur.Nextcur.Next = prevprev = curcur = next}// 3. 比较前后两部分p1, p2 := head, prevfor p2 != nil {if p1.Val != p2.Val {return false}p1 = p1.Nextp2 = p2.Next}return true
}
// 创建测试链表
func createList(nums []int) *ListNode {if len(nums) == 0 {return nil}head := &ListNode{Val: nums[0]}cur := headfor i := 1; i < len(nums); i++ {cur.Next = &ListNode{Val: nums[i]}cur = cur.Next}return head
}
// 测试函数
func main() {// 测试用例tests := []struct {nums []intexpected bool}{{[]int{1, 2, 2, 1}, true}, // 示例1{[]int{1, 2}, false}, // 示例2{[]int{1}, true}, // 单节点{[]int{}, true}, // 空链表{[]int{1, 2, 3, 2, 1}, true}, // 奇数长度回文{[]int{1, 2, 3, 4}, false}, // 非回文{[]int{1, 1}, true}, // 两节点相同{[]int{1, 2, 1}, true}, // 三节点回文}// 运行测试for i, test := range tests {head := createList(test.nums)result := isPalindrome(head)if result == test.expected {fmt.Printf("测试用例 %d ✓: %v -> %v\n", i+1, test.nums, result)} else {fmt.Printf("测试用例 %d ✗: %v -> %v (期望 %v)\n", i+1, test.nums, result, test.expected)}}
}
func isPalindrome(head *ListNode) bool {if head == nil || head.Next == nil {return true}// 快慢指针找中点slow, fast := head, headfor fast != nil && fast.Next != nil {slow = slow.Nextfast = fast.Next.Next}// 反转后半部分var prev *ListNodecur := slowfor cur != nil {next := cur.Nextcur.Next = prevprev = curcur = next}// 比较前后两部分p1, p2 := head, prevfor p2 != nil {if p1.Val != p2.Val {return false}p1 = p1.Nextp2 = p2.Next}return true
}
代码详解
1. 边界处理
go
if head == nil || head.Next == nil {return true
}
head == nil:空链表,没有节点,视为回文head.Next == nil:只有一个节点,如[1],也是回文这两种情况直接返回
true
2. 快慢指针找中点
go
slow, fast := head, head
for fast != nil && fast.Next != nil {slow = slow.Nextfast = fast.Next.Next
}
快慢指针原理:
slow慢指针:每次走 1 步fast快指针:每次走 2 步当
fast到达末尾时,slow正好在中间
示例说明:
text
链表: 1 -> 2 -> 3 -> 2 -> 1初始: slow=1, fast=1
第1次: slow=2, fast=3
第2次: slow=3, fast=1
结束: slow指向3(中间节点)链表: 1 -> 2 -> 2 -> 1初始: slow=1, fast=1
第1次: slow=2, fast=2
第2次: slow=2, fast=nil
结束: slow指向第二个2
3. 反转后半部分链表
go
var prev *ListNode
cur := slow
for cur != nil {next := cur.Nextcur.Next = prevprev = curcur = next
}
反转过程详解:
text
假设链表后半部分: 3 -> 2 -> 1 -> nil
cur = 3, prev = nil第1次循环:next = cur.Next = 2 // 保存下一个节点cur.Next = prev = nil // 3 -> nilprev = cur = 3 // prev指向3cur = next = 2 // cur指向2第2次循环:next = cur.Next = 1 // 保存下一个节点cur.Next = prev = 3 // 2 -> 3prev = cur = 2 // prev指向2cur = next = 1 // cur指向1第3次循环:next = cur.Next = nil // 保存下一个节点cur.Next = prev = 2 // 1 -> 2prev = cur = 1 // prev指向1cur = next = nil // cur指向nil结果: 1 -> 2 -> 3 -> nil
4. 比较前后两部分
go
p1, p2 := head, prev
for p2 != nil {if p1.Val != p2.Val {return false}p1 = p1.Nextp2 = p2.Next
}
比较逻辑:
p1从头节点开始(前半部分)p2从反转后的后半部分头节点开始逐个比较节点的值,只要有一个不相等就返回
false
为什么只比较到 p2 != nil?
因为后半部分长度 ≤ 前半部分
奇数长度时,中间节点不需要比较
偶数长度时,两部分长度相等
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1209472.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
湖南可靠的冷库建造厂家有哪些,哪家口碑好?
2026年冷链经济持续升级,专业冷库建造已成为医药、食品、新能源等行业保障产品安全、提升供应链效率的核心支撑。无论是符合GSP标准的医药冷库、适配农产品保鲜的食品冷库,还是满足工业物料存储的超低温冷库,优质建…
SVN培训笔记(二):使用sourceTree通过git桥接管理svn项目
前言使用sourcetree管理git非常方便,还能额外调用beyond Compare,非常方便,但是git管理权限,是直接服务器用户管理,svn可以通过文本管理,结合sourcetree,最终定好是通过sourceTree管理svn。 解决痛点1:git权限…
2026雅思网课培训线上哪个好?高性价比与提分冲刺指南机构测评推荐
本次测评由全国雅思教学质量监测中心联合海外留学教研联盟全程指导,参照《2024-2025中国大陆雅思成绩大数据报告》核心标准,覆盖28个核心城市区县,结合11200份考生及家长调研问卷、148家教育机构全维度实测结果开展…
vllm单机多卡(无Ray)部署架构
目录部署架构图1️⃣ 前提条件2️⃣ 多实例部署逻辑3️⃣ 注意事项在单 GPU 服务器上,如果单个 Qwen14B 模型实例需要 2 张 GPU,那么必须启动 4 个独立模型服务,每个服务绑定 2 张 GPU 并监听独立端口。这样才能充分…
基于spring的地产企业工程项目管理系统[spring]-计算机毕业设计源码+LW文档
摘要:随着房地产行业的蓬勃发展,地产企业工程项目管理面临着诸多挑战。为了提高管理效率、降低成本并确保项目顺利进行,开发一套高效的工程项目管理系统至关重要。本文介绍了一个基于Spring框架的地产企业工程项目管理系统,详细阐…
基于spring的大学生兼职网[spring]-计算机毕业设计源码+LW文档
摘要:随着高校扩招和就业压力的增大,大学生兼职现象日益普遍。为了给大学生提供一个安全、便捷、丰富的兼职信息平台,同时为企业提供高效的人才招聘渠道,开发一个基于Spring框架的大学生兼职网具有重要意义。本文详细阐述了基于Sp…
基于spring的创新团队管理平台[spring]-计算机毕业设计源码+LW文档
摘要:在创新驱动发展的时代背景下,创新团队的高效管理成为提升创新能力的关键因素。为了满足创新团队在人员管理、信息共享、任务协作等方面的需求,本文基于Spring框架设计并实现了一个创新团队管理平台。该平台涵盖了系统用户管理、导师管理…
志趣网 item_get - 获取公司详情接口对接全攻略:从入门到精通
志趣网 item_get 公司详情接口(官方标准命名 zhiqu.item.get.company)是面向B2B 批发、二手设备、闲置物资、招商加盟等场景的企业信息查询接口,通过公司唯一标识 company_id 可获取企业工商信息、经营资质、供应能力、联系方式、交易记录、诚…
教育领域新玩法:用Live Avatar制作AI讲师课程
教育领域新玩法:用Live Avatar制作AI讲师课程
在教育行业,课程录制一直是个耗时耗力的活儿。老师要反复调整语速、表情、手势,还要配合剪辑、字幕、特效,一节10分钟的微课常常要花上半天时间。最近试了阿里联合高校开源的Live Av…
用YOLOv9官方镜像做毕业设计,简单又出彩
用YOLOv9官方镜像做毕业设计,简单又出彩
毕业设计是本科阶段最能体现综合能力的实践环节。对计算机视觉方向的同学来说,目标检测项目既实用又有展示度——但真正动手时,很多人卡在环境配置、数据准备、训练调参这些“看不见的功夫”上。你可…
IQuest-Coder-V1 vs PolyCoder:小团队开发适配性对比
IQuest-Coder-V1 vs PolyCoder:小团队开发适配性对比
1. 为什么小团队需要认真看待这两款代码模型
你是不是也经历过这样的场景:三五人的开发小组,既要快速迭代产品功能,又要兼顾代码质量、文档补全和新人上手;没有专…
Unsloth能否用于生产?企业级部署稳定性实战评估
Unsloth能否用于生产?企业级部署稳定性实战评估
在AI工程落地的现实场景中,模型微调框架的选择往往决定了项目能否从实验室走向产线。当团队手握业务数据、急需定制化大模型能力,却面临显存不足、训练缓慢、部署复杂等现实瓶颈时,…
异构GPU架构(英伟达+华为升腾等)
目录异构GPU部署架构一、问题背景二、推荐架构三、架构设计逻辑四、实践注意事项五、工程价值二开的工作分布掌握理解 vLLM 底层源码, LLM 推理核心逻辑、KV Cache 管理、请求分发、batch 处理、TP/PP 支持等
掌握其他…
深入解析:零基础学AI大模型之Milvus索引实战
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
告别手动剪辑!FSMN-VAD帮你自动切分语音片段
告别手动剪辑!FSMN-VAD帮你自动切分语音片段
你是否经历过这样的场景:花两小时录完一段30分钟的播客,结果发现中间穿插了17次咳嗽、5次键盘敲击、3段空调嗡鸣,还有4次长达20秒的沉默?更糟的是,想用传统音频…
Qwen3-Embedding-0.6B推荐部署:开箱即用镜像提升开发效率
Qwen3-Embedding-0.6B推荐部署:开箱即用镜像提升开发效率
你是否还在为搭建文本嵌入服务反复调试环境、编译依赖、调整显存配置而头疼?是否在多个项目中重复部署相似的embedding模型,却总卡在CUDA版本兼容、tokenizer加载失败或API接口不一致…
NewBie-image-Exp0.1出现OOM?显存不足问题的三种解决方案实战
NewBie-image-Exp0.1出现OOM?显存不足问题的三种解决方案实战
你刚拉起 NewBie-image-Exp0.1 镜像,执行 python test.py 后却突然卡住,终端只留下一行刺眼的报错:CUDA out of memory。显存监控显示 GPU 已 99% 占用,但…
IndexTTS-2模型权重获取:Apache 2.0许可合规使用指南
IndexTTS-2模型权重获取:Apache 2.0许可合规使用指南
1. 为什么你需要这份指南
你是不是也遇到过这些情况? 下载了一个语音合成模型,跑起来报错“ttsfrd not found”; 想用知北发音人,结果情感切换不生效;…
MinerU技术架构解析:magic-pdf与mineru协作机制
MinerU技术架构解析:magic-pdf与mineru协作机制
1. 镜像核心能力与定位
MinerU 2.5-1.2B 是一款专为PDF文档智能解析设计的深度学习镜像,聚焦解决科研、工程、出版等场景中长期存在的排版解析难题。它不是简单地把PDF转成文字,而是真正理解…
Llama3语音扩展 vs Speech Seaco Paraformer:中文识别能力对比
Llama3语音扩展 vs Speech Seaco Paraformer:中文识别能力对比
在中文语音识别(ASR)领域,选择一个真正好用、稳定、准确的模型不是看参数有多炫,而是看它能不能听懂你说话——尤其是带口音、有背景音、语速快、专业术…