【剑指offer】NC21 链表内指定区间反转 [Go语言]

168 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情

题目

描述

将一个节点数为 size 链表 m 位置到 n 位置之间的区间反转,要求时间复杂度 O(n)O(n),空间复杂度 O(1)。

数据范围: 链表长度 0 < size ≤1000,0 < m ≤ n ≤ size,链表中每个节点的值满足 0 <∣val∣≤1000

要求:时间复杂度 O(n),空间复杂度 O(n)

进阶:时间复杂度 O(n),空间复杂度 O(1)

示例1

输入:

{1,2,3,4,5},2,4

返回值:

{1,4,3,2,5}

示例2

输入:

{5},1,1

返回值:

{5}

思路

思路其实很明确,就是反转第n到m个节点上的链表操作。然后把最后一个接上去即可。不过要注意接上去的节点信息。

AC Code

func reverseBetween( head *ListNode ,  m int ,  n int ) *ListNode {
    pre := &ListNode{Next:head}
    for i:=0; i<m-1; i++ {
(1)        pre = pre.Next
    }
(2)    pre.Next = reserve(pre.Next,n-m+1)
    return head
}

func reserve(root *ListNode, k int) *ListNode {
    var pre,curNext *ListNode
    cur := root
(3)    for i:=0; i<k; i++ {
        curNext = cur.Next
        cur.Next = pre
        pre = cur
        cur = curNext
    }
(4)    root.Next = curNext
    return pre
}
  • (1) 一直遍历,直到这个遇到这个节点为止。即是找到开始反转的节点。
  • (2) 让这个节点的下一个等于反转后的节点
  • (3) 进行反转,创建前中后的节点信息,让这三个不断向前迭代循环反转。
  • (4) 反转完特定节点后,让这个root的下一个节点等于接下来的节点。