两两交换链表中的节点

144 阅读1分钟

两两交换链表中的节点

要求

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

思路

假设该链表为:1->2->3->4->5

定一个虚拟头节点let ret = new ListNode(-1, head)

再let一个temp指向虚拟头节点(用来寻找交换的节点)let temp = ret

微信截图_20211216221446.png

由上图可知,翻转的是head.next和head.next.next,所以我们可以来个while循环

    // 判断,当temp后面还有两个节点的时候,满足翻转,才进入while循环
    while (temp.next && temp.next.next) {
        // let一个pre存temp.next,用来交换
        let pre = temp.next;
        // let一个pcur存temp.next.next,用来交换
        let cur = temp.next.next;
        // pre.next = cur.next详情见图1
        pre.next = cur.next;
        // cur.next = pre详情见图2
        cur.next = pre;
        // temp.next = cur详情见图3
        temp.next = cur;
        // temp = pre详情见图4
        temp = pre;
    }

图1:pre.next = cur.next;

1.png 图2:cur.next = pre;

2.png 图3:temp.next = cur;

3.png 图4:temp = pre;

4.png

完整代码

var swapPairs = function (head) {
    if (!head) return head;
    let ret = new ListNode(-1, head),
        temp = ret;
    while (temp.next && temp.next.next) {
        let pre = temp.next;
        let cur = temp.next.next;
        pre.next = cur.next;
        cur.next = pre;
        temp.next = cur;
        temp = pre;
    }
    return ret.next;
};