链表数据结构

  链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续防止的。每个元素由一个存储元素本身的节点和一个只想下一个元素的引用(也称为指针或链接)组成

类似的例子

创建链表

  • 创建一个类表示链表
  • 链表内应该有一些方法
    • 向链表尾部添加一个新元素
    • 向链表特定位置添加一个新元素
    • 返回链表中特定位置元素 不存在返回undefined
    • 移除一个元素
    • 返回元素在链表中的索引
    • 从链表特定位置移除一个元素
    • 如果链表中不包含任何元素,返回true,如果链表长度大于0返回false
    • 返回链表包含的元素个数
    • 返回整个链表的字符串

创建一个类列表链表

class Linkedlist {
constructor(equalsFn = defaultEquals) {
this.count = 0;
this.head = undefined;
this.equalsFn = equalsFn;
}
}

创建一个类表示链表元素

class Node{
constructor(el){
this.el = el
this.next = undefined
}
}

向链表尾部添加元素

push(el){
const node = new Node(el)
let current;
if(this.head == null){
this.head = node;
}else{
current = this.head;;
while(current.next != null){
current = current.next;
}
current.next = node;
}
this.count++;
}

从链表移中除元素

removeAt(index) {
if (index >= 0 && index < this.count) {
let current = this.head;
if (index === 0) {
this.head = this.next;
} else {
let previous;
for (let i = 0; i < index; i++) {
previous = current;
current = current.next;
}
previous.next = current.next
}
this.count--;
return current.element;
}
return undefined
}

逻辑复用方法 循环迭代链表直到目标位置

getElmentAt(index){
if(index >= 0 && index <= this.count){
let node = this.head;
for (let i = 0; i < index && node != null; i++) {
node = node.next;
}
return node;
}
return undefined;
}

在任意位置插入元素

insert(el,index){
if (index >= 0 && index <= this.count){
const node = new Node(el)
if(index === 0){
const current = this.head;
node.next = current;
this.head = node;
}else{
const previous = this.getElmentAt(index - 1)
const current = previous.next;
node.next = current;
previous.next = node;
}
this.count++;
return true;
}
return false;
}

返回一个元素的位置

indexOf(el){
let current = this.head;
for (let i = 0; i < this.count && current != null; i++) {
if(this.equalsFn(el,current.el)){
return i;
}
current = current.next;
}
return -1
}

从链表中移除元素

remove(el){
const index = this.indexOf(el);
return this.removeAt(index)
}

获取链表位置

size(){
return this.count;
}

判断是否为空

isEmpty(){
return this.size() === 0
}

获取链表

getHead(){
return this.head
}

返回整个链表的字符串

toString(){
if(this.head == null){
return '';
}
let objString = `${this.head.el}`;
let current = this.head.next;
for (let i = 0; i < this.size() && current != null; i++) {
objString = `${objString},${current.el}`;
current = current.next;
}
return objString;
}

数据结构之链表(JavaScript描述)的更多相关文章

  1. 《数据结构与算法JavaScript描述》

    <数据结构与算法JavaScript描述> 基本信息 作者: (美)Michael McMillan 译者: 王群锋 杜欢 丛书名: 图灵程序设计丛书 出版社:人民邮电出版社 ISBN:9 ...

  2. 翻阅《数据结构与算法javascript描述》--数组篇

    导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScript 中的数组是一种特殊的对象,用来表示偏移量的索引是该对象的属性 ...

  3. 数据结构与算法javascript描述

    <数据结构与算法javascript描述>--数组篇 导读: 这篇文章比较长,介绍了数组常见的操作方法以及一些注意事项,最后还有几道经典的练习题(面试题). 数组的定义: JavaScri ...

  4. 列表的实现-----数据结构与算法JavaScript描述 第三章

    实现一个列表 script var booklist = new List(); booklist.append('jsbook'); booklist.append('cssbook'); book ...

  5. 《数据结构与算法JavaScript描述》中的一处错误

    最近在看<数据结构与算法JavaScript描述>这本书,看到选择排序这部分时,发现一个比较大的错误. 原书的选择排序算法是这样的: function selectionSort() { ...

  6. 数据结构与算法 Javascript描述

    数据结构与算法系列主要记录<数据结构与算法 Javascript描述>学习心得

  7. 数据结构与算法JavaScript描述——链表

    1.数组的缺点 数组不总是组织数据的最佳数据结构,原因如下. 在很多编程语言中,数组的长度是固定的,所以当数组已被数据填满时,再要加入新的元素就会非常困难. 在数组中,添加和删除元素也很麻烦,因为需要 ...

  8. 链表--数据结构与算法JavaScript描述(6)

    链表 概念 链表是由一组节点组成的集合. 每个节点都使用一个对象的引用指向它的后继. 指向另一个节点的引用叫做 链. 许多链表的实现都在链表最前面有一个特殊节点,叫做头节点. 链表的尾元素指向一个nu ...

  9. 读《数据结构与算法 Javascript描述》 | 平淡无奇

    “平淡无奇”,一句话总结. 当初买这本书的原因,在意的是有没有什么令人惊喜的东西,特别是针对Javascript代码的奇思妙想,所以就买下了这本书. 在买的几本书里面,最先看的也是这一本,但看起目录就 ...

随机推荐

  1. 鸿蒙开源第三方组件 ——B站开源弹幕库引擎的迁移(上)

    鸿蒙入门指南,小白速来!0基础学习路线分享,高效学习方法,重点答疑解惑--->[课程入口] 目录: 一.弹幕库的基础知识 二.弹幕库的使用方法 三.sample解析 四.作者系列文章合集 前言 ...

  2. Using Sqoop to import from db2 to hadoop

    参考 : https://stackoverflow.com/questions/23933481/db2-data-import-into-hadoop         sqoop import - ...

  3. Django-用户权限,用户角色使用指南

    RBAC(Role-Based Access Control,基于角色的访问控制)就是用户通过角色与权限进行关联.简单地说,一个用户拥有若干角色,每一个角色拥有若干权限.这样,就构造成"用户 ...

  4. Django 自定义标签与过滤器报错 No module named 'templatetags'

    Django 自定义标签与过滤器报错 按照网上的教程如果想使用自定义的标签与过滤器就得往settings.py中添加下列数据 TEMPLATES = [ { 'BACKEND': 'django.te ...

  5. pyinstaller打包exe运行失败

    使用Pyinstaller来打包自己开发的软件时遇到的几个问题及解决方法.工具主要功能是数据分析,使用机器学习算法完成数据训练和预测功能.主要用到了两个学习库keras和sklearn,所以说在打包时 ...

  6. 微信小程序3D轮播图

    <!-- 轮播图 --> <swiper previous-margin='50px' next-margin='50px' bindchange="swiperChang ...

  7. 剑指 Offer 38. 字符串的排列 + 无重复元素的全排列

    剑指 Offer 38. 字符串的排列 Offer_38 题目描述 解题思路 可以使用递归实现全排列,每次都确定一个数的位置,当所有位置的数都确定后即表示一个排列. 但是考虑到本题需要排除重复的排列, ...

  8. 快速查找未打补丁的exp

    在windows DOS窗口下输入以下内容,输出为未打的补丁信息列表 systeminfo>vul.txt&(for %i in (KB977165 KB2160329 KB250366 ...

  9. FreeBSD 发布 2020 年 Q3 季度报告

    FreeBSD 几日前发布 Q3 季度报告,介绍了在过去第三季度里 FreeBSD 完成的工作和相关项目,涉及到架构支持.内核改进.持续集成和驱动程序优化等. 列举部分如下: FreeBSD 基金会目 ...

  10. FreeBSD 开发已经迁移至 git

    FreeBSD 开发已经迁移至 git 全部预计于 2021 年 3 月完成迁移. https://git.freebsd.org/src.git 或者 https://cgit.freebsd.or ...