题目
🔗题目链接:24. 两两交换链表中的节点 - 力扣(LeetCode)
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入: head = [1,2,3,4]
输出: [2,1,4,3]
示例 2:
输入: head = []
输出: []
示例 3:
输入: head = [1]
输出: [1]
提示:
- 链表中节点的数目在范围
[0, 100]内 0 <= Node.val <= 100
思路
创建虚拟头节点,使用这种方式不需要对头节点进行特殊处理
创建一个 cur 指针用于遍历链表
再创建 3 指针用于交换链表元素
代码
以 head = [1,2,3,4] 为例,画一遍循环过程。
/**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
function swapPairs(head: ListNode | null): ListNode | null {
if (!head) return head;
const dummyHead = new ListNode(0, head);
let cur = dummyHead;
// 保证至少有两个节点
while(cur && cur.next && cur.next.next) {
let firstNode = cur.next;
let secondNode = cur.next.next;
let thirdNode = cur.next.next.next;
// 交换节点
cur.next = secondNode;
secondNode.next = firstNode;
firstNode.next = thirdNode;
// cur 指针后移
cur = firstNode;
}
return dummyHead.next;
};