「LeetCode系列」24. 两两交换链表中的节点|刷题打卡

127 阅读1分钟

零、前言

从这篇文章开始刷 写给前端的算法进阶指南,我是如何两个月零基础刷200题

一、题目描述:

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

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。

你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例 1:

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

示例 2:

输入:head = [] 输出:[] 示例 3:

输入:head = [1] 输出:[1]

提示 :

链表中节点的数目在范围 [0, 100] 内 0 <= Node.val <= 100

进阶:你能在不修改链表节点值的情况下解决这个问题吗?(也就是说,仅修改节点本身。)

二、思路分析

主要还是考察链表的基础操作。

拿到题的第一刻还有点蒙,算法题刷的不多,前年开始系统接触算法,比较少刷。拿到题目描述在想,我靠这么简单,这一个数组直接遍历一下,隔一个交换下下标对应内容。结果代码里给的是链表的数据结构。

1·主要是交换节点,

dummyNode -> node1 -> node2

node1.next=node1.next.next;
node2.next=node1;
dummyNode.next=node2;

2·while循环结束标志 temp为每次需要交换节点的前一个,所以只要temp.next或temp.next.next一个为空就结束循环。刚开始的时候我直接写 while(temp.next===null || temp.next.next === null) 所以老是调试不对。

三、AC代码

/**
 * Definition for singly-linked list.
 * function ListNode(val, next) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.next = (next===undefined ? null : next)
 * }
 */
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var swapPairs = function (head) {
    if (head === null || head.next == null) {
        return head
    }
    var dummyHead = new ListNode(0);
    dummyHead.next = head;
    var temp = dummyHead;
    while (temp.next != null && temp.next.next !== null) {
        var node1 = temp.next;
        var node2 = temp.next.next;
        node1.next = node2.next;
        node2.next = node1;
        temp.next = node2;

        temp = node1;
    }

    return dummyHead.next
**};**