image.png
    移动方法
    43254846f029b4814a6c9a139e4f9f89833ac54803ea50b24feb35210631f88b-a.jpg
    图片资源来源https://leetcode-cn.com/problems/swap-nodes-in-pairs/solution/bi-jiao-zhi-jie-gao-xiao-de-zuo-fa-han-tu-jie-by-w/

    image.png

    需要在设置一个前置节点,来不停的移动

    1. package main
    2. import "fmt"
    3. type ListNode struct {
    4. Val int
    5. Next *ListNode
    6. }
    7. func swapPairs1(head *ListNode) *ListNode {
    8. dummy := &ListNode{-1, nil}
    9. dummy.Next = head
    10. preNode := dummy // 就是前一个节点
    11. for head != nil && head.Next!= nil{
    12. first := head
    13. second := head.Next
    14. //交换前两个节点
    15. first.Next = second.Next
    16. second.Next = first
    17. preNode.Next =second
    18. preNode = first //需要把位置移到前一个节点去
    19. head = first.Next
    20. }
    21. return dummy.Next
    22. }
    23. func swapPairs(head *ListNode) *ListNode {
    24. dummy := &ListNode{}
    25. dummy.Next = head
    26. preNode := dummy
    27. for head!=nil&&head.Next!=nil{
    28. first := head
    29. second := head.Next
    30. // 交换数据
    31. preNode.Next = second
    32. first.Next = second.Next
    33. second.Next = first
    34. // 移动
    35. preNode = first
    36. head = first.Next
    37. }
    38. return dummy.Next
    39. }
    40. func main() {
    41. a := &ListNode{Val: 1}
    42. b := &ListNode{Val: 2}
    43. c := &ListNode{Val: 3}
    44. d := &ListNode{Val: 4}
    45. e := &ListNode{Val: 5}
    46. f := &ListNode{Val: 6}
    47. a.Next=b
    48. b.Next =c
    49. c.Next = d
    50. d.Next = e
    51. e.Next = f
    52. h := swapPairs1(a)
    53. for h!=nil{
    54. fmt.Println(h.Val)
    55. h=h.Next
    56. }
    57. }

    递归

    1. func swapPairs2(head *ListNode) *ListNode {
    2. //终止条件:链表只剩一个节点或者没节点了,没得交换了。返回的是已经处理好的链表
    3. if head ==nil||head.Next==nil {
    4. return head
    5. }
    6. //一共三个节点:head, next, swapPairs(next.next)
    7. //下面的任务便是交换这3个节点中的前两个节点
    8. next := head.Next
    9. head.Next= swapPairs2(next.Next)
    10. next.Next = head
    11. //根据第二步:返回给上一级的是当前已经完成交换后,即处理好了的链表部分
    12. return next
    13. }