题目地址
题解
- 题目关键在于弄清楚链表各个指针交换前交换后的位置
思路1:迭代
- 思路
- 分析时间复杂度O(n)空间复杂度 O(1)
- 代码实现
var swapPairs = function (head) {
if (!head || !head.next) return head
// 两个节点交换后,最新的头结点为第二个节点,所以最后返回mark
let mark = head.next
let cur = head, nxt = null, pre = head
// 当还存在两个节点时就继续迭代
while (cur && cur.next) {
// 交换两个节点
nxt = cur.next
pre.next = nxt
cur.next = nxt.next
nxt.next = cur
// 重新初始化pre cur指针
pre = cur
cur = cur.next
}
return mark
};
思路2:递归
- 分析时间复杂度O(n)空间复杂度 O(1)
- 代码实现
var swapPairs = function (head) {
// 递归终止条件
if (!head || !head.next) return head
// 本层递归需要干的事
// 头结点和头结点的next节点交换后,nxt为新的头结点
let nxt = head.next
// 递归调用
head.next = swapPairs(nxt.next)
nxt.next = head
// 返回给上层的数据
return nxt
};