思路
对于上面的链,以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;
//改变next
p.next = node2;
node2.next = node1;
node1.next = next;
//最后移动p指针
p = node1;
}
//返回虚拟头节点的next节点
return dummyHead.next;
}