24. 两两交换链表中的节点
题目链接/文章讲解/视频讲解:点击跳转链接
思路:使用虚拟头结点
代码如下
public ListNode swapPairs(ListNode head) {
//初始化定义
ListNode dumyHead = new ListNode(-1); //定义一个虚拟头结点
dumyHead.next = head; //虚拟头结点放在真实头结点的前边
ListNode cur = dumyHead; //定义当前结点的位置
//临时变量保存
ListNode temp; //临时节点保存两个结点后面的结点
ListNode firstNode; //保存两个交换节点中的第一个节点
ListNode secondNode; //保存两个交换节点中的第二个节点
//循环,进行交换元素位置
while (cur.next != null && cur.next.next != null){
// 交换前保存结点信息
temp = cur.next.next.next;
firstNode = cur.next;
secondNode = cur.next.next;
//交换
cur.next = secondNode; //交换的步骤一
secondNode.next = firstNode; //交换的步骤二
firstNode.next = temp; //交换的步骤三
cur = firstNode; // cur移动,准备下一轮交换
}
return dumyHead.next;
}
Tips:在移动当前指针时,cur = firstNode;
firstNode节点保存的就是下一轮交换两个元素的前一个元素,
也是本轮交换后第二个元素的位置。
交换步骤画图