[路飞]_两两交换链表中的节点

259 阅读2分钟

题目介绍

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

示例1

image.png

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

示例2

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

示例3

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

提示:

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

leetcode-24 两两交换链表中的节点
b站视频

解题思路

迭代法

迭代法就是遍历整个链表的所有节点,当相邻两个节点能够成对时,交换两个节点之间的位置

1.定义一个虚拟头节点,虚拟头节点的下一个节点指向头节点
2.定义 pre 指针指向虚拟头节点,定义 cur 指针指向头节点
3.当 curcur.next 存在时,使用 next 指针指向 cur.next
4.pre 的下一个节点指向 next
5.cur 的下一个节点指向 next 的下一个节点
6.next 的下一个节点指向 cur
7.pre 指向 curcur 指向 cur 的下一个节点
8.重复执行 3-7,直到链表结束

5.gif

解题代码

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

递归法

递归法需要找到递归结束的条件和递归的过程

在当前题目中,递归的过程为奇数节点和下一个偶数节点之间的交换,递归结束的条件为当前节点或者当前节点的下一个节点为空节点,即节点不成对

1.判断当前节点或者当前节点的下一个节点是否为空,为空则返回当前节点
2.定义 next 指针指向当前节点的下一个节点
3.假设除了当前的节点对没有交换,后续的节点对都已经交换完成,那么当前节点的下一个节点应该指向反转完成的链表的头节点
4.next 指针指向的节点的下一个节点指向当前节点
5.返回 next 指针指向的节点,即反转之后的链表头节点

6.gif

解题代码

var swapPairs = function(head) {
    if (!head || !head.next) return head
    const next = head.next
    head.next= swapPairs(next.next)
    next.next = head
    return next
};

以上就是本题的解题思路,欢迎查看我的其他文章
[路飞]_环形链表
[路飞]_环形链表II
[路飞]_快乐数
[路飞]_反转链表
[路飞]_反转链表II
[路飞]_K 个一组翻转链表
[路飞]_旋转链表