LeetCode 24 Swap Nodes in Pairs (Tag:Linked List Difficulty:Medium)

412 阅读2分钟

这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战

前言

关于 LeetCode 数组类型题目的相关解法,可见LeetCode 数组类型题目做前必看,分类别解法总结了题目,可以用来单项提高。觉得有帮助的话,记得多多点赞关注哦,感谢!

题目描述

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

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

示例 1:

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

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

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

链接:leetcode-cn.com/problems/sw…

题解

这道题意思是将链表中的节点两两交换。两两交换时,为了保持链表的完整性,需要三个指针:需要交换的两个节点的指针以及前一个节点的指针。所以,我们的做法也是用三个指针来完成整个交换过程。

首先,也是做链表题目首先要想到的,就是建立一个假的头,假的头的 next 指针指向真的 head,这个假头可以帮助我们减少边界情况的判断,这道题目中,我们就可以让 prev 指针指向假头。

然后定义 fisrt 和 second 两个指针,指向需要交换位置的两个节点。交换的过程很简单,只需要模拟这个过程就行了。交换完,需要将 prev,first,second 指向新的位置,需要注意的是,指向新位置时,first 有可能为空指针,所以需要额外判断一下。最后循环交换即可。

当然,开始时要记得判断 head 的情况,可以直接返回答案。

具体代码如下,时间复杂度为 O(n).

/**
 * 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 || !head.next) return head
    let dummy = new ListNode(0)
    let prev = dummy
    prev.next = head
    let first = head
    let second = first.next
    while (first && second) {
        let next = second.next
        first.next = next
        second.next = first
        prev.next = second
        
        prev = first
        first = first.next
        // first 指针有可能为空
        if (first) {
            second = first.next
        }   
    }
    return dummy.next
};