思路

对于上面的链,以1 2 为例
相当于让1的前一个节点指向2
2指向1
1指向2的后一个节点
这里需要知道1的前一个节点是谁
而head没有头,因此引入虚拟的头结点 dummyHead
设立一个指针p,它是要交换的节点的前一个节点
node1 node2指向要交换的两个节点
设立指针next指向要交换的两个节点的后一个节点
有了这4个指针就好做了
p的next指向node2 node2的next指向node1 node1的next指向next

即,此时node2和node1进行了交换
此时完成了一对节点的交换,此后需要将p指针指向下一对要比较节点的前一个节点,即node1
接下来重复操作
public ListNode swapPairs(ListNode head) {//虚拟头结点ListNode dummyHead = new ListNode(0);dummyHead.next = head;//p指向要交换两个节点的前一个节点ListNode p = dummyHead;//如果node1和node2存在才进行交换while( p.next !=null && p.next.next !=null){//声明三个指针ListNode node1 = p.next;ListNode node2 = node1.next;ListNode next = node2.next;//改变nextp.next = node2;node2.next = node1;node1.next = next;//最后移动p指针p = node1;}//返回虚拟头节点的next节点return dummyHead.next;}
