链表相关的操作
链表是否有环
// 判断是否有环,有返回入口节点,无返回null·
let hasCycle = function(head) {
let set = new Set();
while (head != null) {
if (set.has(head)) {
return head;
} else {
set.add(head)
head = head.next;
}
}
return null;
};利用 json.stringify 不能序列化含有循环引用的结构
let hasCycle = function(head) {
try{
JSON.stringify(head);
return false;
}
catch(err){
return true;
}
};
解法三:快慢指针(双指针法) 设置快慢两个指针,遍历单链表,快指针一次走两步,慢指针一次走一步,如果单链表中存在环,则快慢指针终会指向同一个节点,否则直到快指针指向 null 时,快慢指针都不可能相遇
链表反转(反转链表)
链表倒数第 k 个节点
合并两个有序链表
将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
输入:1->2->4, 1->3->4 输出:1->1->2->3->4->4
两两交换链表中的节点
递归的终止条件是链表中没有节点,或者链表中只有一个节点,此时无法进行交换。
这边其实分为三个步骤
首先判断 head 有没有 和 head。next 有没有存在
原始链表的头节点是 newHead 表示新的链表的头节点, 原始链表的第二个节点, 则原始链表的其余节点的头节点是 newHead.next。 令head.next = swapPairs(newHead.next), 表示将其余节点进行两两交换, 交换后的新的节点为head的下一个节点,
然后令 newHead.next = head,即可完成所有节点的交换。 最后返回新的链表的头节点 newHead。
反转从位置 m 到 n 的链表
删除中间节点
但是本题中我们只能访问要删除的节点,所以这个方法用不了。那我们可以把当前节点的下一个节点的值拿过来覆盖掉要删除的值,然后把当前节点的 next 指向下一个节点的 next 即可。
最后更新于
这有帮助吗?