image.png

思路

image.png
对于上面的链,以1 2 为例
相当于让1的前一个节点指向2
2指向1
1指向2的后一个节点
这里需要知道1的前一个节点是谁
而head没有头,因此引入虚拟的头结点 dummyHead

设立一个指针p,它是要交换的节点的前一个节点
node1 node2指向要交换的两个节点
设立指针next指向要交换的两个节点的后一个节点
image.png

有了这4个指针就好做了

p的next指向node2 node2的next指向node1 node1的next指向next

image.png
即,此时node2和node1进行了交换
image.png
此时完成了一对节点的交换,此后需要将p指针指向下一对要比较节点的前一个节点,即node1
image.png
接下来重复操作

  1. public ListNode swapPairs(ListNode head) {
  2. //虚拟头结点
  3. ListNode dummyHead = new ListNode(0);
  4. dummyHead.next = head;
  5. //p指向要交换两个节点的前一个节点
  6. ListNode p = dummyHead;
  7. //如果node1和node2存在才进行交换
  8. while( p.next !=null && p.next.next !=null){
  9. //声明三个指针
  10. ListNode node1 = p.next;
  11. ListNode node2 = node1.next;
  12. ListNode next = node2.next;
  13. //改变next
  14. p.next = node2;
  15. node2.next = node1;
  16. node1.next = next;
  17. //最后移动p指针
  18. p = node1;
  19. }
  20. //返回虚拟头节点的next节点
  21. return dummyHead.next;
  22. }