
package mainimport "fmt"type ListNode struct { Val int Next *ListNode}func reverseBetween1(head *ListNode, m int, n int) *ListNode { dummyNode := &ListNode{} dummyNode.Next = head begin := dummyNode for i:=0;i<m-1;i++{ begin = begin.Next } var pre *ListNode curr := begin.Next for i:=0;i<n-m+1;i++{ tmp := curr.Next curr.Next = pre pre = curr curr = tmp } begin.Next.Next = curr// 链接后节点 begin.Next = pre // 开始反转的最后节点 return dummyNode.Next}func reverseBetween(head *ListNode, m int, n int) *ListNode { dummyHead :=&ListNode{ Val: -1, Next: head, } curr :=head i := 1 pre :=dummyHead var next *ListNode var start *ListNode for curr!=nil{ if i==m { start = curr } if i==n{ next = curr.Next curr.Next = nil pre.Next = revertNode(start) start.Next = next return dummyHead.Next } if i<=m-1{ pre = curr //获取前一个节点 } curr = curr.Next i++ } return dummyHead.Next}func revertNode(head*ListNode)*ListNode{ curr :=head var pre *ListNode for curr!=nil{ pre,curr,curr.Next = curr,curr.Next,pre } return pre}func revertNode1(head*ListNode)*ListNode{ var pre *ListNode curr := head for curr!=nil{ tmp :=curr.Next curr.Next = pre pre = curr curr= tmp } return pre}func makeLinkedList(list []int)*ListNode{ dummyNode := &ListNode{} // 创建哑结点 指向头节点 curr := dummyNode for i:=0;i<len(list);i++{ curr.Next= &ListNode{Val:list[i]} curr = curr.Next } return dummyNode.Next}func main() { head := makeLinkedList([]int{1,2,3,4,5}) // head = revertNode(head) head = reverseBetween(head,1,2) for head!=nil{ fmt.Println(head.Val) head = head.Next }}
