前端算法小白攻略7-leetcode(两两交换链表中的节点)

146 阅读1分钟

前言

上一个攻略我们解决了k个一组链表的翻转问题,今天这个两两交换链表中的节点,你可以直接令k=2即可,当然我们这里会用一种更简单的方法来实现,无需额外定义翻转函数;

题目描述

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

输入: head = [1,2,3,4]
输出: [2,1,4,3]

结合下图开始解题

图片.png

var swapPairs = function(head) {
    if(!head) return null;
    let ret = new ListNode(-1,head), pre = ret, cur = head;
    while(cur && cur.next) {  // 我们交换的节点cur和cur.next必须都为真才可交换
        let temp = cur.next;  // 1、图中第1步:保存cur.next的临时指针
        cur.next = cur.next.next;  // 2、图中第2步:将待交换的首节点指向尾节点的下一个节点,为交换的第一步
        temp.next = cur; // 3、图中第3步:将待交换的尾节点指向首节点,为交换的第二步
        pre.next = temp; // 4、图中第4步:将待交换节点的前一个节点即pre指向的节点连接待交换的尾部节点
        pre = cur;   // 最后我们移动pre指针到交换后的尾节点(即交换前的首节点)
        cur = cur.next; // cur对应我们交换前的首节点,他的下一个节点就是我们下次交换的起始节点;
    }
    return ret.next;
};