这是我参与11月更文挑战的第27天,活动详情查看:2021最后一次更文挑战
前言
关于 LeetCode 数组类型题目的相关解法,可见LeetCode 数组类型题目做前必看,分类别解法总结了题目,可以用来单项提高。觉得有帮助的话,记得多多点赞关注哦,感谢!
题目描述
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入: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
};