思考
题目给出要求:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
首先看到这个题,让我想到了(k 个一组翻转链表),只要把其中的 k 换成 2 就行了。
当然我们用另一种方式来做。
解题思路
设:虚拟头节点 hair ,待翻转的小链表头指针 temp ,相邻节点的前一个阶段 pre 、后一个节点 cur。
- 当头指针的下一个或下下个节点为空时,链表翻转操作结束;
- 节点做交换:
- pre指向cur的下一个节点;
- cur指向pre;
- temp指向cur;
- temp 走到 pre的位置作为一个交换的头指针。
- 重复上面步骤。
temp pre cur
hair -> 1 -> 2 -> 3 -> 4
temp pre cur
hair -> 1 -> 3 -> 4 2
temp cur pre
hair 2 -> 1 -> 3 -> 4
temp cur pre
hair -> 2 -> 1 -> 3 -> 4
temp
cur pre
hair -> 1 -> 2 -> 3 -> 4
代码
var swapPairs = function(head) {
if (!head) return head;
let hair = new ListNode(-1, head), temp = hair;
// 当头指针的下一个或下下个节点为空时,链表翻转操作结束;
while (temp.next && temp.next.next) {
let pre = temp.next, cur = temp.next.next;
// 1. pre指向cur的下一个节点;
pre.next = cur.next;
// 2. cur指向pre;
cur.next = pre;
// 3. temp指向cur;
temp.next = cur;
// 4. temp 走到 pre的位置作为一个交换的头指针
temp = pre;
}
return hair.next;
};