「这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战」
题目:
24. 两两交换链表中的节点
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
示例 1:
输入: head = [1,2,3,4]
输出: [2,1,4,3]
示例 2:
输入: head = []
输出: []
示例 3:
输入: head = [1]
输出: [1]
提示:
- 链表中节点的数目在范围
[0, 100]内 0 <= Node.val <= 100
思路:
- 开辟一个新链表
result,存储我们的结果; - 用一个变量
prev来记录当前result的最后一个节点,这样子拼接的时候直接通过prev.next即可; - 每一轮我们拿出链表的两个节点,旋转后接入到
result中; - 遍历结束后,可能有剩余单个节点,也可能没有,直接接入到结果链表最后即可。
实现:
/**
* Definition for singly-linked list.
* function ListNode(val, next) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
*/
/**
* @param {ListNode} head
* @return {ListNode}
*/
var swapPairs = function(head) {
// 开辟一个节点,返回直接取result.next; 这样子我们不用在循环中判断是否头节点
let result = { val: 0, next: null };
// 记录最后一个节点
let prev = result;
// 超过两个节点才能进行翻转
while (head && head.next) {
const temp = head.next;
// 缓存节点,下一轮
const next = temp.next;
// 拆开链表,不然会形成闭环
head.next = null;
temp.next = head;
prev.next = temp;
prev = head;
// 记得对链表进行往后传递,不然会无限循环
head = next;
}
// 不管有没有剩余都直接接入
prev.next = head;
return result.next;
};
看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。