92. 反转链表 II

120 阅读1分钟

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

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。 解法:

/**
 * Definition for singly-linked list.
 * type ListNode struct {
 *     Val int
 *     Next *ListNode
 * }
 */
func reverseBetween(head *ListNode, left int, right int) *ListNode {
    preLeft := &ListNode{
        Val: 0,
        Next: head,
    }
    leftNode := head
    rightNode := head
    for i := 1; i < left; i ++ {
        preLeft = preLeft.Next
        leftNode = leftNode.Next
        rightNode = rightNode.Next
    }
    // preLeft、leftNode已就位
    rightNode = rightNode.Next
    for j := left; j < right; j ++ {
        tmp := rightNode.Next
        rightNode.Next = leftNode
        leftNode = rightNode
        rightNode = tmp
    }
    if preLeft.Next.Next != nil {
        preLeft.Next.Next = rightNode
    }
    preLeft.Next = leftNode
    if left > 1 {   // 如果移动超过1的话,preLeft.Next就不是head节点
        return head
    }
    return preLeft.Next

}