栈队列与链表

简介: 栈队列与链表

栈队列与链表

栈(Stack)

栈是后进先出的线性表,在js中,我们可以看做一个数组,进栈(添加元素)的方法为push(),而出栈(移除元素)的方法为pop()

例如:

const stack = [];
//入栈
stack.push(1);//[1]
stack.push(2);//[1,2]
stack.push(3);//[1,2,3]
//出栈
stack.pop();//[1,2]
stack.pop();//[1]
stack.pop();//[]

队列(Queue)

队列是先进先出的线性表,在js中,我们同样也可以把队列看做一个数组,入队(添加元素)的方法为push(),而出队(移除元素)的方法为shift()

例如:

const queue = [];
//入队
queue.push(1);//[1]
queue.push(2);//[1,2]
queue.push(3);//[1,2,3]
//出对
queue.shift();//[2,3]
queue.shift();//[3]
queue.shift();//[]

链表(ListNode)

在js中,链表是一种类数组对象。关于数组,它的内存空间是连续的,而链表是分散的。所以链表需要前驱后继来进行关联。其中,链表的数据单位叫结点

注意,为了确保起点结点是能抵达的,我们有时还会设定一个head指针来专门指向链表的开始位置。

我们可以使用对象来模拟它:

const node = {
    value:1,
    next:{
        value:2,
        next:{
            //...
        }
    }
}

书写构造函数

function ListNode(value){
  this.value = value
  this.next = null
}

const node = new ListNode(1)
node.next = new ListNode(2)
console.log(node);//ListNode { value: 1, next: ListNode { value: 2, next: null } }

链表结点的添加

//如果节点不存在,则创建该节点
const node3 = new ListNode(3)
//将node3的后继指向node2(node1的后继)
node3.next = node1.next
//将node1的后继指向node3
node1.next = node3

链表结点的删除

(node1-node3-node2=>node1-node2):

//找到node1当前的后继(node3)
const target = node1.next
//将此时的node1的后继改为node3的后继(node2)
node1.next = target.next

此时的node3便成为一个无法到达的节点了,所以会被js的垃圾回收自动回收。

链表与数组比较

链表读取数据的时间复杂度为O(n),因为需要从起始结点遍历到查询的结点为止,数组为O(1)。但相对数组,链表对数据的添加删除更加便捷。

相关文章
|
3月前
|
存储 算法 搜索推荐
探索常见数据结构:数组、链表、栈、队列、树和图
探索常见数据结构:数组、链表、栈、队列、树和图
136 64
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
87 5
|
2月前
|
算法
数据结构之购物车系统(链表和栈)
本文介绍了基于链表和栈的购物车系统的设计与实现。该系统通过命令行界面提供商品管理、购物车查看、结算等功能,支持用户便捷地管理购物清单。核心代码定义了商品、购物车商品节点和购物车的数据结构,并实现了添加、删除商品、查看购物车内容及结算等操作。算法分析显示,系统在处理小规模购物车时表现良好,但在大规模购物车操作下可能存在性能瓶颈。
61 0
|
7月前
|
数据安全/隐私保护
第2章 栈、队列、链表
第2章 栈、队列、链表
|
8月前
|
算法 测试技术
【数据结构与算法 | 基础篇】单向循环链表实现队列
【数据结构与算法 | 基础篇】单向循环链表实现队列
|
7月前
栈和链表的区分
栈和链表的区分
31 0
|
7月前
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
7月前
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表
|
7月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
69 2
|
8月前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
86 1