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
 
占用内存 1192KB
posted @   重新出发123  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· DeepSeek在M芯片Mac上本地化部署
· 葡萄城 AI 搜索升级:DeepSeek 加持,客户体验更智能
点击右上角即可分享
微信分享提示