package main import "fmt" /** * Definition for singly-linked list.*/ type ListNode struct { Val int Next *ListNode } func makeLink(arr []int) *ListNode { if len(arr) == 0 { return nil } head := &ListNode{} cur := head for _, v := range arr { cur.Next = &ListNode{Val: v} cur = cur.Next } return head.Next } func checkLink(head *ListNode) { for head != nil { fmt.Println(head.Val) head = head.Next } } func reverseBetween(head *ListNode, left int, right int) *ListNode { if head.Next == nil { return head } left-- right-- cur_idx := 0 cur := head var left_node *ListNode var left_pre_node *ListNode = nil _ = left_pre_node var last_node *ListNode = nil do_rev := false for { if cur_idx == left { left_node = cur left_pre_node = last_node do_rev = true } next := cur.Next if do_rev { next = cur.Next cur.Next = last_node if cur_idx == right { left_node.Next = next if left_pre_node != nil { left_pre_node.Next = cur } else { head = cur } do_rev = false } } last_node = cur cur = next cur_idx++ if cur == nil { break } } return head } func main() { arr := []int{3, 5} checkLink(reverseBetween(makeLink(arr), 1, 2)) }