24. 两两交换链表中的节点

91 阅读1分钟

题目

🔗题目链接: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;
};