算法思路:
首先对于链表的操作,考虑到头结点的特殊性,我们设置一个虚拟的头结点vmNode,vmNode.next = head,之后的操作就方便多了;题目要求每一对交换节点(不是节点的值),这就涉及到四个节点,考虑到head结点为空或head.next为空,可直接返回head;初始化最开始的四个节点分别为:pre = vmNode,node1 = head , node2 = head.next,node3 = node2.next。然后进行交换操作,操作完后更新它们的值,当node2 为空时退出循环。最终返回vmNode.next。
时间复杂度O(n),空间复杂度O(1)。参考代码:
//leetcode 24. Swap Nodes in Pairs
public ListNode swapPairs(ListNode head) {
if(head==null||head.next==null)
return head;
ListNode vmNode = new ListNode(0);
vmNode.next = head;
ListNode pre = vmNode,node1 = head,node2 = head.next,node3 = node2.next;
while(node2!=null){
pre.next = node2;
node2.next = node1;
node1.next = node3;
pre = pre.next.next;
node1 = pre.next;
if(node1!=null)
node2 = node1.next;
else
node2 = null;
if(node2!=null)
node3 = node2.next;
else
node3 = null;
}
return vmNode.next;
}