我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战
读题
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
思路一 递归
var swapPairs = function (head){
// 边界判断 ,空节点和单节点不需要交换
if(head == null || head.next == null)return head
let newHead = head.next // 保存新头节点
head.next = swapPairs(newHead.next) // 将当前头节点指针指向下一个返回的新头
newHead.next = head // 新头指向当前头节点
return newHead;
}
思路二 迭代
/** 首先新建一个虚头temp
* 1. 声明n1 n2
* 接下来按顺序改变指向
* temp.next = n2
* n1.next = n2.next
* n2.next = n1
* temp = n1 交换结束 将temp指向下一个位置 进入下一轮交换
*/
// 代码如下
var swapPairs = function(head){
if(head ==null || head.next == null)return head // 不需要交换
const dummy = {next: head} // 声明虚头
let temp = dummy
while(temp.next && temp.next.next){ //保证能两两交换的条件
let n1 = temp.next
let n2= temp.next.next
// 如图交换
temp.next = n2
n1.next = n2.next
n2.next = n1
// temp 进入下一轮循环
temp = n1
}
return dummy.next
}
链表的交换问题我也是一头雾水啊,必须画图才能慢慢理解,如果交换需要额外的变量如n1,n2 需要声明出来临时保存节点。还有一点的话就是循环的条件,如果在想好循环的条件先置为true,循环里的逻辑写完之后再来确定循环结束的条件就会清晰很多了。
类似的题 leetcode1721 交换链表中的节点 1712题是很简单的题目,这里就不做讲解了。这个题目就是需要确定倒数第k个节点。