题目介绍
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例1
输入: head = [1,2,3,4]
输出: [2,1,4,3]
示例2
输入: head = []
输出: []
示例3
输入: head = [1]
输出: [1]
提示:
- 链表中节点的数目在范围
[0, 100]内 0 <= Node.val <= 100
解题思路
迭代法
迭代法就是遍历整个链表的所有节点,当相邻两个节点能够成对时,交换两个节点之间的位置
1.定义一个虚拟头节点,虚拟头节点的下一个节点指向头节点
2.定义 pre 指针指向虚拟头节点,定义 cur 指针指向头节点
3.当 cur 和 cur.next 存在时,使用 next 指针指向 cur.next
4.pre 的下一个节点指向 next
5.cur 的下一个节点指向 next 的下一个节点
6.next 的下一个节点指向 cur
7.pre 指向 cur,cur 指向 cur 的下一个节点
8.重复执行 3-7,直到链表结束
解题代码
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 指针指向的节点,即反转之后的链表头节点
解题代码
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 个一组翻转链表
[路飞]_旋转链表