这是我参与8月更文挑战的第18天,活动详情查看:8月更文挑战
前言
今天依旧是LeetCode上边的一道链表题目,两两交换链表中的节点,链表这东西真的上头,做着还挺有意思,做链表题我们一定要明确谁的next是谁,逻辑一定要清晰,要不然做着做着就懵了,下面来看下这道题的要求和解题思路
题目描述
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 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运行结果
总结
链表中两两节点调换大致就是这样,最主要的还是思路,要调理清晰,如有高见欢迎留言指点,gogogo