返回
前端算法实战|链表基础操作篇
前端
2023-10-29 18:01:45
前言
链表是一种常见的线性数据结构,它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。链表在前端开发中非常有用,它可以用来实现各种数据结构,例如栈、队列、哈希表等。
本文将介绍链表的基础操作,包括链表的合并、链表的删除以及链表删除的延申。这些操作都是前端工程师必须掌握的基本技能。
链表的合并
链表的合并是指将两个有序链表合并成一个有序链表。合并后的链表依然有序,并且包含两个原链表的所有元素。
链表的合并可以通过递归或者迭代的方式来实现。这里我们介绍递归的方式。
/**
* 合并两个有序链表
*
* @param {ListNode} l1 第一个链表
* @param {ListNode} l2 第二个链表
* @return {ListNode} 合并后的链表
*/
const mergeTwoLists = (l1, l2) => {
if (l1 === null) {
return l2;
}
if (l2 === null) {
return l1;
}
if (l1.val < l2.val) {
l1.next = mergeTwoLists(l1.next, l2);
return l1;
} else {
l2.next = mergeTwoLists(l1, l2.next);
return l2;
}
};
链表的删除
链表的删除是指从链表中删除一个指定的节点。
链表的删除可以通过迭代或者递归的方式来实现。这里我们介绍迭代的方式。
/**
* 从链表中删除一个指定的节点
*
* @param {ListNode} head 链表的头节点
* @param {ListNode} node 要删除的节点
* @return {ListNode} 删除后的链表
*/
const deleteNode = (head, node) => {
if (head === null || node === null) {
return head;
}
if (node === head) {
return head.next;
}
ListNode prev = null;
ListNode current = head;
while (current !== null) {
if (current === node) {
prev.next = current.next;
break;
}
prev = current;
current = current.next;
}
return head;
};
链表删除的延申
链表删除的延申是指从链表中删除一个范围内的节点。
链表删除的延申可以通过迭代或者递归的方式来实现。这里我们介绍迭代的方式。
/**
* 从链表中删除一个范围内的节点
*
* @param {ListNode} head 链表的头节点
* @param {number} start 开始位置
* @param {number} end 结束位置
* @return {ListNode} 删除后的链表
*/
const deleteRange = (head, start, end) => {
if (head === null || start < 1 || end < start) {
return head;
}
ListNode prev = null;
ListNode current = head;
while (current !== null) {
if (start === 1) {
head = current.next;
start++;
} else if (start > 1) {
prev.next = current.next;
start++;
}
if (end === start) {
prev.next = current.next;
break;
}
prev = current;
current = current.next;
}
return head;
};
总结
链表是一种常见的数据结构,它在前端开发中非常有用。本文介绍了链表的基础操作,包括链表的合并、链表的删除以及链表删除的延申。这些操作都是前端工程师必须掌握的基本技能。