image.png

    1. package main
    2. import "fmt"
    3. type ListNode struct {
    4. Val int
    5. Next *ListNode
    6. }
    7. func reverseBetween1(head *ListNode, m int, n int) *ListNode {
    8. dummyNode := &ListNode{}
    9. dummyNode.Next = head
    10. begin := dummyNode
    11. for i:=0;i<m-1;i++{
    12. begin = begin.Next
    13. }
    14. var pre *ListNode
    15. curr := begin.Next
    16. for i:=0;i<n-m+1;i++{
    17. tmp := curr.Next
    18. curr.Next = pre
    19. pre = curr
    20. curr = tmp
    21. }
    22. begin.Next.Next = curr// 链接后节点
    23. begin.Next = pre // 开始反转的最后节点
    24. return dummyNode.Next
    25. }
    26. func reverseBetween(head *ListNode, m int, n int) *ListNode {
    27. dummyHead :=&ListNode{
    28. Val: -1,
    29. Next: head,
    30. }
    31. curr :=head
    32. i := 1
    33. pre :=dummyHead
    34. var next *ListNode
    35. var start *ListNode
    36. for curr!=nil{
    37. if i==m {
    38. start = curr
    39. }
    40. if i==n{
    41. next = curr.Next
    42. curr.Next = nil
    43. pre.Next = revertNode(start)
    44. start.Next = next
    45. return dummyHead.Next
    46. }
    47. if i<=m-1{
    48. pre = curr //获取前一个节点
    49. }
    50. curr = curr.Next
    51. i++
    52. }
    53. return dummyHead.Next
    54. }
    55. func revertNode(head*ListNode)*ListNode{
    56. curr :=head
    57. var pre *ListNode
    58. for curr!=nil{
    59. pre,curr,curr.Next = curr,curr.Next,pre
    60. }
    61. return pre
    62. }
    63. func revertNode1(head*ListNode)*ListNode{
    64. var pre *ListNode
    65. curr := head
    66. for curr!=nil{
    67. tmp :=curr.Next
    68. curr.Next = pre
    69. pre = curr
    70. curr= tmp
    71. }
    72. return pre
    73. }
    74. func makeLinkedList(list []int)*ListNode{
    75. dummyNode := &ListNode{} // 创建哑结点 指向头节点
    76. curr := dummyNode
    77. for i:=0;i<len(list);i++{
    78. curr.Next= &ListNode{Val:list[i]}
    79. curr = curr.Next
    80. }
    81. return dummyNode.Next
    82. }
    83. func main() {
    84. head := makeLinkedList([]int{1,2,3,4,5})
    85. // head = revertNode(head)
    86. head = reverseBetween(head,1,2)
    87. for head!=nil{
    88. fmt.Println(head.Val)
    89. head = head.Next
    90. }
    91. }

    image.png