BM2 链表内指定区间反转
https://www.nowcoder.com/practice/b58434e200a648c589ca2063f1faf58c?tpId=295&tqId=654&ru=%2Fpractice%2F1291064f4d5d4bdeaefbf0dd47d78541&qru=%2Fta%2Fformat-top101%2Fquestion-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D295
Go
将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n)O(n)O(n),空间复杂度 O(1)O(1)O(1)。
先记录四个关键位置(m前面的节点,m节点,n节点,n后面的节点),再进行反转处理。
边界情况:
m=n 不需要反转,直接返回
m是第一个节点会改变头节点,引入一个新的头节点消除这种特殊情况
package main
import . "nc_tools"
/*
* type ListNode struct{
* Val int
* Next *ListNode
* }
*/
/**
*
* @param head ListNode类
* @param m int整型
* @param n int整型
* @return ListNode类
*/
func reverseBetween( head *ListNode , m int , n int ) *ListNode {
// write code here
if m == n{
return head
}
hpre := new(ListNode)
hpre.Next = head
var hcpre, mpre,mcur,ncur,nnext *ListNode
hc := head
hcpre = hpre
//遍历到n
for i:=1;i<n;i++{
if i == m{
mcur = hc
mpre = hcpre
}
hcpre = hc
hc = hc.Next
}
ncur = hc
nnext = hc.Next
//开始反转
mpre.Next = ncur
pre := mcur
cur:= mcur.Next
for cur != nnext{
curnext := cur.Next
cur.Next = pre
pre = cur
cur = curnext
}
mcur.Next = nnext
return hpre.Next
}
运行时间 4ms
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能