一、LeetCode24.两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例 3:
输入:head = [1] 输出:[1]
先上代码
class Solution {
public ListNode swapPairs(ListNode head) {
// 创建哑节点,方便处理头节点的特殊情况
ListNode dummy = new ListNode(-1);
dummy.next = head;
ListNode pre = dummy; // pre指向已经处理好的节点
ListNode cur = head; // cur指向当前待处理的节点
ListNode next;
// 当当前节点及其下一个节点都存在时,进行交换操作
while (cur != null && cur.next != null){
next = cur.next; // next指向下一个待处理的节点
cur.next = next.next; // 将当前节点的next指针指向下一个待处理的节点的next指针,跳过下一个节点
next.next = cur; // 将下一个待处理的节点的next指针指向当前节点,完成交换
pre.next = next; // 将已经处理好的节点的next指针指向交换后的新节点,连接链表
pre = cur; // 更新pre指针,指向已经处理好的节点
cur = cur.next; // 更新cur指针,指向下一个待处理的节点
}
return dummy.next; // 返回新的链表头节点
}
}
这道题的思路和先前的指定反转底层思路其实是一样的。这里是将反转的数量变成了 2.
next = cur.next;
cur.next = next.next;
next.next = cur;
pre.next = next;
这四行完全就是指定区间反转里的代码,我都没改,额外添加的是
pre = cur;
cur = cur.next;
因为是两两互换,换完之后,我们要将cur节点和pre节点移动到下一组需要交换的两个节点上。
有个易错点:是先移动pre节点,再移动cur节点。我写的时候就先移动了cur,导致报错了。