给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
来源:力扣(LeetCode)
链接:leetcode-cn.com/problems/sw…
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
首先,我们定义了一个ListNode
类,用于表示链表的节点。每个节点包含一个val
属性表示节点的值,以及一个next
属性表示指向下一个节点的指针。
定义swapPairs
函数,它接受一个链表的头节点作为参数,并返回交换相邻节点后的链表头节点。在函数内部,创建一个哑节点dummy
,并将它的next
指针指向传入的头节点。哑节点的作用是方便处理链表头部的交换情况。
然后,使用一个while
循环来遍历链表。在每一次循环中,我们检查当前节点head
以及它的下一个节点head.next
是否存在。如果存在,将需要交换的两个节点分别保存为first
和second
。
接下来,我们进行节点的交换操作。首先,将哑节点dummy
的next
指针指向second
,将first
的next
指针指向second.next
,将second
的next
指针指向first
,完成节点的交换。
最后,我们更新指针,将prev
指向first
,将head
指向first.next
,继续下一次循环。
当循环结束后,我们返回哑节点dummy
的next
指针,即为交换相邻节点后的链表头节点。
function ListNode(val) {
this.val = val;
this.next = null;
}
function swapPairs(head) {
// 创建哑节点
let dummy = new ListNode(0);
dummy.next = head;
let prev = dummy;
while (head && head.next) {
// 获取需要交换的节点
let first = head;
let second = head.next;
// 交换节点
prev.next = second;
first.next = second.next;
second.next = first;
// 更新指针
prev = first;
head = first.next;
}
return dummy.next;
}
// 创建链表
let head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
head.next.next.next = new ListNode(4);
// 调用函数并打印结果
let newHead = swapPairs(head);
console.log(newHead)//2,1,4,3