LeetCode两两交换链表中的节点 | 算法练习系列

260 阅读2分钟

这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战

前言

今天依旧是LeetCode上边的一道链表题目,两两交换链表中的节点,链表这东西真的上头,做着还挺有意思,做链表题我们一定要明确谁的next是谁,逻辑一定要清晰,要不然做着做着就懵了,下面来看下这道题的要求和解题思路

题目描述

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

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

两两.jpg  

示例 1:

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

输出:[2,1,4,3]

示例 2:

输入:head = []

输出:[]

示例 3:

输入:head = [1]

输出:[1]

解题思路

  • 通过题目我们可以知道,如果我们把这个链表当做数组,它调换的是下标为(1,2)(3,4)。。。的项,如果最后只剩下一项则不用调换
  • 这道题目我们要定义三个指针,这里可以理解会数组中排序里的两个数对调,我们至少需要三个参数才能完成调换
  • 这道题目我们要在开头做处理,因为开始调换的时候,也就是第一个节点和第二个节点调换,我们此时还需要一个指针p,此时没有符合条件的节点可以用来做p的指向,所以我们需要用if判断来对第一和第二个节点来进行调换,或者声明一个dummy来指向头部,那么就可以把p指向这个节点,第一个节点和第二个节点也就可以调换了,代码如下
/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var swapPairs = function(head) {
    let dummy = new ListNode()
    dummy.next= head
    let p = dummy
    while(p.next!==null && p.next.next!==null){ //当其中有一个项为空及停止循环
        //通过下面的6步完成一次调换,并把p,n1,n2,三个指针移到下次需要的位置
        let n1 = p.next
        let n2 = p.next.next
        //下边的散步是真正的调换操作
        p.next = n1.next
        n1.next = n2.next
        n2.next = n1
        //把p移动到下次交换的两个节点的前一个节点
        p = n1
    }
    return dummy.next //最后return dummy.next而不是dummy
};

LeetCode运行结果

链表调换.PNG

总结

链表中两两节点调换大致就是这样,最主要的还是思路,要调理清晰,如有高见欢迎留言指点,gogogo