LeetCode 0024. 两两交换链表中的节点
原题链接:24. 两两交换链表中的节点 - 力扣(LeetCode)
一、 思路:双指针
用到 pre
和 temp
两个指针,此外,还可以把传入的参数 head
也当作节点的指针加以利用。代码一下子就简洁很多了。
做这种题一定要画图,不然很容易把自己绕晕了。
二、 代码实现
public static ListNode swapPairs(ListNode head) {
if (head == null || head.next == null) { //如果传入的链表为空或仅有一个节点,则直接返回原链表
return head;
}
ListNode virHead = new ListNode(0, head); //创建虚拟头节点
ListNode pre = virHead; //前指针
ListNode temp = null; //创建辅助节点
while (pre.next != null && pre.next.next != null) { //这样的循环条件可以一举解决奇偶节点数量问题
temp = head.next.next; //缓存head指针后移位置
pre.next = head.next; //步骤①
head.next.next = head; //步骤②
head.next = temp; //步骤③
//指针后移
pre = head; //pre后移2位
head = head.next; //head后移1位
}
return virHead.next;
}
三、 总结
- 在链表类的题目中,
temp
辅助节点在绝大多数情况下,是用来缓存链表变动前给指针往后移动的位置的。在操作过程中绝不允许改变temp
和temp.next
。 - 有时候传入的参数
head
也可以作为指针使用。即可以往后移动更新其位置。