JavaScript的数据结构快速学-链表的实现
1-单项链表
function LinkedList() {
let Node = function(element) { // 辅助类,表示要添加到链表中的项
this.element = element;
this.next = null; //next属性是只想链表的下一个节点的指针
};
let length = 0,
head = null; // 头指针
this.append = function(element) {}; // 向链表尾部添加一个新的项
this.insert = function(element, position) {}; // 向指定位置插入一个新的项
this.removeAt = function(position) {}; // 移除链表中的指定项
this.remove = function(element) {}; // 移除值为element的项
this.indexOf = function(element) {}; // 返回元素在链表中的索引,如果没有则返回-1
this.isEmpty = function() {}; // 判断链表中是否为空
this.size = function() {}; // 链表的长度
this.clear = function() {}; // 清空链表
this.print = function() {}; //输出链表的值
}
append实现:向链表尾部添加一个新的项
this.append = function(element) { //向链表尾部添加一个新的项
let node = new Node(element),
current;
if (head === null) { // 链表中的第一个节点
head = node;
} else {
current = head;
while (current.next) { // 循环链表,直到找到最后一项
current = current.next;
}
current.next = node; // 找到最后一项,将next赋值为node,建立连接
}
length += 1; //更新链表长度
};
print实现:输出链表的值
this.print = function() {
let current = head;
for (let i = 0; i < length; i++) {
console.log(`第${i+1}个值:${current.element}`);
current = current.next;
}
};
insert实现:向指定位置插入一个新的项
向指定位置插入一个新的项,步骤如下:
- 先进行position的越界判断!!
- case1: 当position=0的时候,那就是直接将当前head指向的节点变成新建node的next指向,head指向新建的node上
- case2: 除case1外的情况,先遍历到如下图所示的情况,我们设置两个指针,每次遍历都是current将值赋给previous,然后current向后推进,直到current指向position的位置,previous指向position的前一个

- 然后将新建的node,插入其中,然后改变其中的指针指向,具体看代码
- 最后将length加一

this.insert = function(element, position) { // 向指定位置插入一个新的项
if (position >= 0 && position <= length) { // 检查越界值
let node = new Node(element),
current = head, // 设置两指针
previous;
if (position === 0) { // 在第一个位置添加
node.next = head;
head = node;
}else {
for (let i = 0; i < position; i++) {
// 使得current定在要插入的位置,previous定在要插入位置的前一个位置
previous = current;
current = current.next;
}
// 将新项node插入进去
node.next = current;
previous.next = node;
}
}else {
return 0;
}
length += 1;
};
对于函数参数含有position这类的位置参数,一定要注意越界判断
removeAt实现:移除链表中的指定位置项
removeAt的思想和前面的insert方法很相似,唯一的不同就是移除指定项时,改变指针指向的代码不同previous.next = current.next;,
- 具体思想如图:将current指向的项(其实也就是position指向的项)移除,那就将图中红色叉的指针指向取消,然后用新的代替
- 然后将lenght减一

- 只有
previous.next = current.next;和insert方法不同,其他思想和做法都一样
this.removeaAt = function(position) { // 移除链表中的指定项
if (position >= 0 && position <= length) {
let current = head,
previous;
if (position === 0) {
head = head.next;
}else {
for (let i = 0; i < position; i++) { //此处循环到current指向要移除的位置,同insert方法
previous = current;
current = current.next;
}
// 通过将previous的next变化到current.next,将指定项移除
previous.next = current.next;
}
}else {
return 0;
}
length -= 1;
};
indexOf实现:返回元素在链表中的索引,如果没有则返回-1
this.indexOf = function(element) { // 返回元素在链表中的索引,如果没有则返回-1
let current = head; //
for (let i = 0; i < length; i++) {
if (current.element === element) {
return i;
}
current = current.next;
}
return -1;
};
remove实现:移除值为element的项
this.remove = function(element) { // 移除值为element的项
// remove方法可以直接通过复用 this.indexOf(element) 和 this.removeAt(position) 方法实现
let index = this.indexOf(element);
return this.removeaAt(index);
};
isEmpty、size、clear实现
this.isEmpty = function() { // 判断链表中是否为空
return length === 0;
};
this.size = function() { // 链表的长度
return length;
};
this.clear = function() { // 清空链表
let current = head;
for (let i = 0; i < length; i++) {
this.removeAt(i);
}
length = 0;
head = null;
};
测试函数
(function LinkedListTest() {
let linked = new LinkedList();
linked.append(2);
linked.append(3);
linked.append(4);
linked.print(); // 第1个值:2 第2个值:3 第3个值:4
linked.insert(5, 1); // 位置从0开始
linked.print(); // 第1个值:2 第2个值:5 第3个值:3 第4个值:4
linked.removeAt(1); // 相当于将上面插入的5再删除
linked.print(); // 第1个值:2 第2个值:3 第3个值:4
console.log(linked.indexOf(3)); // 1
console.log(linked.indexOf(10)); // -1
console.log(linked.size()); // 3
console.log(linked.isEmpty()); // false
linked.clear();
console.log(linked.isEmpty()); // true
})();
JavaScript的数据结构快速学-链表的实现的更多相关文章
- JavaScript 版数据结构与算法(三)链表
今天,我们要讲的是数据结构与算法中的链表. 链表简介 链表是什么?链表是一种动态的数据结构,这意味着我们可以任意增删元素,它会按需扩容.为何要使用链表?下面列举一些链表的用途: 因为数组的存储有缺陷: ...
- JavaScript数据结构与算法-链表练习
链表的实现 一. 单向链表 // Node类 function Node (element) { this.element = element; this.next = null; } // Link ...
- javascript数据结构之单链表
下面是用javascript实现的单链表,但是在输出的时候insert方法中存在问题,chrome的console报错说不能读取空的属性,调试了很久都没有通过,先在这里存着,以后再来修改一下. //数 ...
- 第一章:javascript: 数据结构与算法
在前端工程师中,常常有一种声音,我们为什么要学数据结构与算法,没有数据结构与算法,我们一样很好的完成工作.实际上,算法是一个宽泛的概念,我们写的任何程序都可以称为算法,甚至往冰箱里放大象,也要通过开门 ...
- javascript实现数据结构与算法系列:栈 -- 顺序存储表示和链式表示及示例
栈(Stack)是限定仅在表尾进行插入或删除操作的线性表.表尾为栈顶(top),表头为栈底(bottom),不含元素的空表为空栈. 栈又称为后进先出(last in first out)的线性表. 堆 ...
- Javascript模仿C语言的链表实现(增删改查),并且使用控制台输入输出
Js新手最近在研究Js数据结构,刚好看到链表实现这一块儿,觉得有些资料和自己理解的有冲突,于是借着自己以前一点点C语言的基础,用Javascript模仿了C的链表实现,并且用了process.stdi ...
- javascript实现数据结构:广义表
原文:javascript实现数据结构:广义表 广义表是线性表的推广.广泛用于人工智能的表处理语言Lisp,把广义表作为基本的数据结构. 广义表一般记作: LS = (a1, a2, ..., an ...
- JavaScript 版数据结构与算法(二)队列
今天,我们要讲的是数据结构与算法中的队列. 队列简介 队列是什么?队列是一种先进先出(FIFO)的数据结构.队列有什么用呢?队列通常用来描述算法或生活中的一些先进先出的场景,比如: 在图的广度优先遍历 ...
- 2018年如何快速学Java
前言 只有光头才能变强 提前预警:本文适合Java新手阅读(老手可在评论区给下建议),希望大家看完能有所收获. 一.为什么我要写下这篇文章 1.1直接缘由: 在今天(2018年11月4日)有个同学给我 ...
随机推荐
- AtCoder Beginner Contest 182 F
F - Valid payments 简化题意:有\(n\)种面值的货币,保证\(a[1]=1,且a[i+1]是a[i]的倍数\). 有一个价格为\(x\)元的商品,付款\(y\)元,找零\(y-x\ ...
- 021中国大学生程序设计竞赛(CCPC)- 压力测试赛题解
A.Matrix 挺狗的一道题,从开始冲到最后都没冲出来,都没啥思路. 其实分开考虑每个数的贡献,这个想法也存在过,就是不知道该怎么计算,我们考虑我们单独考虑一个数字\(i(1\leq i\leq n ...
- 王爽汇编第五章,[bx]和loop指令
目录 王爽汇编第五章,[bx]和loop指令 [bx]和loop指令 例子: 王爽汇编第五章,[bx]和loop指令 [bx]和loop指令 [bx]之前我们介绍寄存器的时候,已经很详细的说明过了,b ...
- filter tools
// 过滤商品分类 Vue.filter("cateFilter", (data) => { let tmp = ["一级分类", "二级分 ...
- Java第三天【变量、常量、数据类型】
学习Java第三天!加油!请帖友看看有和不足的地方,和在下说一下,谢谢! 变量 变量(variable): 1.变量的本质就是代表"可操作的存储空间",空间位置是确定的,蛋里面放置 ...
- 深入探索 Linux listen() 函数 backlog 的含义
1:listen()回顾以及问题引入 2:正确的解释 3:实验验证 1:listen()回顾以及问题引入 listen()函数是网络编程中用来使服务器端开始监听端口的系统调用,首先来回顾下listen ...
- 12组-Alpha冲刺-3/6
一.基本情况 队名:字节不跳动 组长博客:https://www.cnblogs.com/147258369k/p/15546442.html 小组人数:10人 二.冲刺概况汇报 侯钦凯 过去两天完成 ...
- Python基础(map/reduce)
from functools import reduce#reduce函数在python3的内建函数移除了,放入了functools模块 #map() list1 = [1,2,3,4,5,6,7,8 ...
- Python--基本数据类型(可变/不可变类型)
目录 Python--基本数据类型 1.整型 int 2.浮点型 float 3.字符串 str 字符串格式 字符串嵌套 4.列表 list 列表元素的下标位置 索引和切片:字符串,列表常用 5.字典 ...
- soft and hard limit
soft限制了资源使用上限; soft可调整; hard限制了soft上限; 普通用户可使用ulimit -H调低hard limit. 限制的是一个进程可用资源, 而不是某个用户总和. man se ...