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 标签:BM2,head,ListNode,cur,int,反转,Next,链表,节点 From: https://www.cnblogs.com/starter-songudi/p/17078601.html