链表 | 24.两两交换链表、19.删除链表的倒数第N个节点、链表相交、142.环形链表
代码随想录算法训练营第四天 | 24.两两交换链表
📋 目录
✅ 24.两两交换链表
✅ 19.删除链表的倒数第N个节点
24.两两交换链表
⏰ 1.解题思路
- 两两元素交换,前面需要一个虚拟节点,才能对后面两个元素进行操作
- 根据链表的元素个数是奇数还是偶数,得到循环退出的条件。
- 为偶数,temp.next = null时,即虚拟头节点的下一个节点为null,跳出循环。
- 为奇数,temp.next.next = null, 跳出循环。
- 具体操作链表的步骤如下图。最终得到链表指针指向:ret --> 2 -->1 --->3
💻2.代码
var swapPairs = function (head) {
let ret = new ListNode(0, head) //定义一个虚拟头节点
temp = ret;//
while (temp.next && temp.next.next) {//循环条件
let cur = temp.next.next, //存temp.next.next节点的初始值
pre = temp.next;
//开始进行节点交换
pre.next = cur.next; //步骤1 1-->3
cur.next = pre; //步骤2 2-->1
temp.next = cur; //此时相当于pre被重新赋值,不再是初始的值。 虚拟节点-->2
temp = temp.next.next; //下一轮循环的头节点 或者写成 temp = pre
}
return ret.next;
};
242.删除链表的倒数第N个节点
⏰ 1.解题思路
- 创建一个新数组,用来记录字符串中字符出现的次数---相当于将字符映射到数组也就是哈希表的索引下标上
- 遍历第一个字符串,将出现的字符次数记录+1,关键代码's.charCodeAt(i) - "a".charCodeAt(i)'
- 遍历第二个字符串,将出现的字符次数-1
- 最后判断数组中元素值是不是都为0,如果不是则返回false
💻 2.代码
/**
* @param {string} s
* @param {string} t
* @return {boolean}
*/
var isAnagram = function (s, t) {
if (s.length !== t.length) return false;
let arr = new Array(26).fill(0); //新建数组,每个元素的值为0
let pivod = "a".charCodeAt(0); //97,不用特意去记ASCII,这里只需要相对位置,eg: "f".charCodeAt(0)=102,减去97,相对位置是5
for (let i = 0, n = s.length; i < n; i++) {
arr[s.charCodeAt(i) - pivod]++; //在arr[index]的数值上加1
arr[t.charCodeAt(i) - pivod]--;
}
return arr.every((i) => i === 0); //返回的是一个布尔值
};
🍯 3.知识点补充
🍊 快速判断一个元素是是否出现在集合中,就要想到用哈希法来解决问题。
🍒 常见的3种哈希表的数据结构,适用范围
-
- 数组:简单的hash表,哈希值小,范围可控
-
- set:数据结构大
- map:数据结构法,并且key有对应的value值
🍇 String.prototype.charCodeAt() 方法返回的 0 到 65535 之间的整数
eg: "a".charCodeAt(0) = 97 是它的ASCII码
🍓 Array.prototype.every() 方法返回的是一个布尔值,是测试一个数组内的所有元素是否都能通过指定函数的测试。
eg: arr.every((i) => i === 0) //测试的就是这个数组中是不是所有元素都是0