// 创建一个链表
function LinkedList(){ // 创建一个Node辅助类,表示需要加入列表的项,它包含一个element属性,即表示需要加入到列表中的值,next属性表示指向下一个节点项目的指针
let Node = function(element){
this.element = element;
this.next = null;
}; // 长度初始化为0,列表头部初始化为空
let length = 0;
let head = null; // 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;
}
// 找到最后一项,将next值赋给node,建立链接
current.next = node;
}
// 更新列表长度
length++;
}; // insert方法,向列表的特定位置插入一个新的项
this.insert = function(position, element){
// 检查越界值
if(position >=0 && position <=length){ // current是对插入元素之后的元素的引用,previous是对插入元素之前的元素的引用
let node = new Node(element),
current = head,
previous,
index = 0; // 在第一项位置添加
if(position === 0){
node.next = current;
head = node;
} else{
while(index++ < position){
previous = current;
current = current.next;
}
node.next = current;
previous.next =node;
}
// 更新列表长度
length++;
return true;
}
else{
return false;
}
}; // removeAt方法:从链表特定位置移除一项
this.removeAt = function(position){
// 检查越界值
if(position > -1 && position < length){
let current = head,
previous,
index = 0; // 移除第一项
if(position === 0){
head = current.next;
} else{
while(index++ < position){
previous = current;
current = current.next;
}
// 将previous与current的下一项链接起来,跳过current从而移除它
previous.next = current.next;
}
// 更新列表长度
length--;
return current.element;
}
else{
return null;
}
}; // remove方法:从列表中移除一项
this.remove = function(element){
let index = this.indexOf(element);
// 调用removeAt()方法
return this.removeAt(index);
}; // indexOf方法:返回元素在列表中的索引,如果没有该元素则返回-1;
this.indexOf = function(element){
let current = head,
index = 0; while(current){
if(element === current.element){
return index;
}
index++;
current = current.next;
} return -1;
}; // isEmpty方法,如果链表中不包含任何元素,则返回true,否则返回false
this.isEmpty = function(){
return length === 0;
}; // size方法,返回链表中包含的元素个数,与数组的length属性类似
this.size = function(){
return length;
}; // getHead方法:返回链表第一个元素
this.getHead = function(){
return head;
}; // toSting方法,由于链表使用了Node类,重写了javascript的toString方法,让其只输出元素的值
this.toString = function(){
let current = head,
string = ''; while(current){
string += current.element + (current.next ? ',':'');
current = current.next;
}
return string;
}; // print方法,用于在控制台输出链表元素
this.print = function(){
console.log(this.toString());
};
} // 链表的使用
var lnkst = new LinkedList(); // 打印链表长度
console.log(lnkst.size()); // 给链表添加元素
lnkst.append(1);
lnkst.append(2);
lnkst.append(3);
lnkst.append(4);
lnkst.append(5); // 调用打印方法
lnkst.print(); //输出1,2,3,4,5 // 插入元素
lnkst.insert(2,'a');
lnkst.print(); //输出1,2,a,3,4,5 // 按位置删除元素
lnkst.removeAt(2);
lnkst.print(); //输出1,2,3,4,5 // 按值删除元素
lnkst.remove(5);
lnkst.print(); //输出1,2,3,4 //判断是否为空
console.log(lnkst.isEmpty()); //false // 获取头部;
console.log(lnkst.getHead()); //1

  

【javascript】数据结构-链表的更多相关文章

  1. JavaScript数据结构——链表

    链表:存储有序的元素集合,但不同于数组,链表中的元素在内存中不是连续放置的.每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成. 好处:可以添加或移除任意项,它会按需扩容 ...

  2. JavaScript数据结构——链表的实现

    前面楼主分别讨论了数据结构栈与队列的实现,当时所用的数据结构都是用的数组来进行实现,但是数组有的时候并不是最佳的数据结构,比如在数组中新增删除元素的时候需要将其他元素进行移动,而在javascript ...

  3. JavaScript数据结构——链表的实现与应用

    链表用来存储有序的元素集合,与数组不同,链表中的元素并非保存在连续的存储空间内,每个元素由一个存储元素本身的节点和一个指向下一个元素的指针构成.当要移动或删除元素时,只需要修改相应元素上的指针就可以了 ...

  4. javascript数据结构-链表

    gihtub博客地址 链表 是一种物理存储单元上非连续.非顺序的存储结构,它既可以表示线性结构,也可以用于表示非线性结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列结点(链表中每 ...

  5. JavaScript数据结构——字典和散列表的实现

    在前一篇文章中,我们介绍了如何在JavaScript中实现集合.字典和集合的主要区别就在于,集合中数据是以[值,值]的形式保存的,我们只关心值本身:而在字典和散列表中数据是以[键,值]的形式保存的,键 ...

  6. JavaScript数据结构——树的实现

    在计算机科学中,树是一种十分重要的数据结构.树被描述为一种分层数据抽象模型,常用来描述数据间的层级关系和组织结构.树也是一种非顺序的数据结构.下图展示了树的定义: 在介绍如何用JavaScript实现 ...

  7. 学习javascript数据结构(二)——链表

    前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...

  8. 为什么我要放弃javaScript数据结构与算法(第五章)—— 链表

    这一章你将会学会如何实现和使用链表这种动态的数据结构,这意味着我们可以从中任意添加或移除项,它会按需进行扩张. 本章内容 链表数据结构 向链表添加元素 从链表移除元素 使用 LinkedList 类 ...

  9. JavaScript数据结构与算法-链表练习

    链表的实现 一. 单向链表 // Node类 function Node (element) { this.element = element; this.next = null; } // Link ...

  10. 重读《学习JavaScript数据结构与算法-第三版》- 第6章 链表(一)

    定场诗 伤情最是晚凉天,憔悴厮人不堪言: 邀酒摧肠三杯醉.寻香惊梦五更寒. 钗头凤斜卿有泪,荼蘼花了我无缘: 小楼寂寞新雨月.也难如钩也难圆. 前言 本章为重读<学习JavaScript数据结构 ...

随机推荐

  1. Hello Redis - Voting on articles

    Redis in Action JOSIAH L. CARLSON MANNING Shelter Island ONE_WEEK_IN_SECONDS = 7 * 86400 VOTE_SCORE ...

  2. 2018/03/09 每日一个Linux命令 之 chgrp/chown

    每日一个Linux命令 2018-03-09 Linux 命令 chgrp/chown chgrp [-参数] [文件或者目录] chown [-参数] [文件所有者]:[文件所属群组] [文件或者目 ...

  3. Can you answer these queries?---hdu4027

    题目链接 有n个数:当操作为1时求L到R的和: 当操作为0时更新L到R为原来的平方根: 不过如果仔细演算的话会发现一个2^64数的平方根开8次也就变成了 1,所以也更新不了多少次,所以可以每次更新到底 ...

  4. Android(八) HandlerThread

    1.Looper Looper used to run a message loop for a thread. Threads by default do not have a message lo ...

  5. lua源代码学习(一)lua的c api外围实现

    工作后,整个人已经比較松懈了.尽管一直在看lua的源代码.可是一直是比較零碎的时间,没有系统的整理,所以还是收获不多.由于近期工作也不是非常忙了,就想整理下lua的源代码学习的笔记.加深下印象,并分享 ...

  6. 查看修改MySQL字符集

    查看修改MySQL字符集 http://blog.sina.com.cn/s/blog_70ac6bec01016fts.html 查看修改MySQL字符集 (2012-08-22 09:53:21) ...

  7. 关于Ubuntu中Could not get lock /var/lib/dpkg/lock解决方案

    在Ubuntu中,有时候运用sudo  apt-get install 安装软件时,会出现一下的情况 E: Could not get lock /var/lib/dpkg/lock - open ( ...

  8. 十天精通CSS3(5)

    background-origin 设置元素背景图片的原始起始位置. 语法: background-origin : border-box | padding-box | content-box; 参 ...

  9. Python + logging 输出到屏幕,将log日志写入文件

    日志 日志是跟踪软件运行时所发生的事件的一种方法.软件开发者在代码中调用日志函数,表明发生了特定的事件.事件由描述性消息描述,该描述性消息可以可选地包含可变数据(即,对于事件的每次出现都潜在地不同的数 ...

  10. Qt界面控件值获取异常处理

    情景简述: 正常情况,我们从控件获取的值是OK的,但有时候就是奇怪的不对头,那么我们可以给获取后的值加上一个不痛不痒的函数,再返回,结果就OK了.至于原因嘛,[呲牙][呲牙] 比如: //正常情况 d ...