算法打卡 | 第3天 | 力扣92:反转链表II

45 阅读1分钟

题目:力扣92:反转链表II

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

 

示例 1:

输入: head = [1,2,3,4,5], left = 2, right = 4
输出: [1,4,3,2,5]

示例 2:

输入: head = [5], left = 1, right = 1
输出: [5]

题解

func reverseBetween(head *ListNode, left int, right int) *ListNode {
    var dummy = &ListNode{Val:-1}
    dummy.Next = head

    pre := dummy
    cur := head
    
    //这里主要是为了挪位置,为了把cur挪到开始翻转的第一个位置,pre同步移动挪到cur前边
    for i := 1; i < left; i++ {
       pre = pre.Next
       cur = cur.Next
    }
    //上边位置挪好了,正式开始移动,
    for i := 0; i < right-left; i++ {
       //比如234,cur在2这个位置,把cur.next也就是3提出来做个临时变量tmp,
       tmp := cur.Next
       //然后把cur下一个指针挪到下下个,也就是2指向4,
       cur.Next = cur.Next.Next
       //然后3下一个节点指向pre的下一个节点,这样3和2就挪过来了,
       tmp.Next = pre.Next
       //然后pre连起来,pre的下一个指向tem也就是3
       pre.Next = tmp
    }
    return dummy.Next
}

反思

我在第10行的边界值弄错了,写的i=1,然后少翻转了一次