[路飞]_leetcode_24.两两交换链表中的节点

111 阅读1分钟

思考

题目给出要求:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

首先看到这个题,让我想到了(k 个一组翻转链表),只要把其中的 k 换成 2 就行了。

当然我们用另一种方式来做。

解题思路

设:虚拟头节点 hair ,待翻转的小链表头指针 temp ,相邻节点的前一个阶段 pre 、后一个节点 cur。

  1. 当头指针的下一个或下下个节点为空时,链表翻转操作结束;
  2. 节点做交换:
    1. pre指向cur的下一个节点;
    2. cur指向pre;
    3. temp指向cur;
    4. temp 走到 pre的位置作为一个交换的头指针。
  3. 重复上面步骤。
temp   pre  cur
hair -> 1 -> 2 -> 3 -> 4

temp   pre            cur
hair -> 1 -> 3 -> 4    2

temp   cur  pre
hair    2 -> 1 -> 3 -> 4

temp   cur  pre
hair -> 2 -> 1 -> 3 -> 4

            temp
       cur  pre
hair -> 1 -> 2 -> 3 -> 4

代码

var swapPairs = function(head) {
    if (!head) return head;
    let hair = new ListNode(-1, head), temp = hair;

    // 当头指针的下一个或下下个节点为空时,链表翻转操作结束;
    while (temp.next && temp.next.next) {
        let pre = temp.next, cur = temp.next.next;
        // 1. pre指向cur的下一个节点;
        pre.next = cur.next;
        // 2. cur指向pre;
        cur.next = pre;
        // 3. temp指向cur;
        temp.next = cur;
        // 4. temp 走到 pre的位置作为一个交换的头指针
        temp = pre;
    }
    return hair.next;
};