持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情
前言
今天的题目为中等,题目能够用递归或者迭代的方式去解答,本文采用了递归的方式,主要就是定义一个目标,然后一次次的去改变链表,知道不满足条件,则迭代完成。
每日一题
今天的题目是 24. 两两交换链表中的节点,难度为中等
- 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]
提示:
- 链表中节点的数目在范围 [0, 100] 内
- 0 <= Node.val <= 100
题解
迭代
使用类似于我们数组交换两个下标元素的方法,也可以用来对链表的两个不同位置进行换位,首先我们需要新建一个链表,并且将链表的 next 设为 head,因为在两两替换之后,现在的head可能就已经不在当前的位置了,可能被换到了后面一位,所以我们直接新建一个链表,把链表的下一级设为head,到时候返回的时候也是返回新建链表的 next,这样无论后面的链表怎么交换,也不会影响到我们的返回值。
所以新建一个链表,将这个链表的下一级指向 head ,然后在这个链表的头部开始,新建一个 cur 表示新链表的头部,将元素的下一级和下下级都赋值出来,再利用交换的方式进行互换,最后将 cur 放在交换后的后一个链表上,继续进行下一个结点和下下结点的交换,一直到 cur 的下一个结点或者下下个结点不存在,则停止交换。
/**
* Definition for singly-linked list.
* class ListNode {
* val: number
* next: ListNode | null
* constructor(val?: number, next?: ListNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.next = (next===undefined ? null : next)
* }
* }
*/
var swapPairs = function(head: ListNode): ListNode {
const dummyHead = new ListNode(0);
dummyHead.next = head;
let cur = dummyHead;
while (cur.next !== null && cur.next.next !== null) {
const node1 = cur.next;
const node2 = cur.next.next;
cur.next = node2;
node1.next = node2.next;
node2.next = node1;
cur = node1;
}
return dummyHead.next;
};