链表数据结构

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

类似的例子

创建链表

  • 创建一个类表示链表
  • 链表内应该有一些方法
    • 向链表尾部添加一个新元素
    • 向链表特定位置添加一个新元素
    • 返回链表中特定位置元素 不存在返回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. springboot学习过程随记

    1.整合shiro+jwt(若忘记需结合测试代码springboot-mybatisplus-shiro-demo看) 配置比较简单 定义一个类继承AuthorizingRealm 如下: (1)pu ...

  2. 正则表达式匹配${key}并在Java中使用

    1.正则表达式匹配${key} \$\{([a-z]+)\} 能够匹配字符串中以${key}形式的文本(其中key为小写应为字母) .*\$\{([a-z]+)\}.* 可以用来检测文本中是否有${k ...

  3. docker ssh秘钥免密登录

    一.概述 有一台跳板机,已经实现了免密登录后端服务器.但是我写了一个django项目,它是运行在容器中的,也需要免密登录后端服务器. 虽然可以在容器中手动做一下免密登录,但是容器重启之后,之前做的设置 ...

  4. Centos7.7下安装Python3.7 并兼容python2.7

    前言 1.首先来看一下系统版本 [root@python3 ~]# cat /etc/redhat-release CentOS Linux release 7.7.1810 (Core) 2.更新一 ...

  5. Codeforces 598D (ccpc-wannafly camp day1) Igor In the Museum

    http://codeforces.com/problemset/problem/598/D 分析:BFS,同一连通区域的周长一样,但查询过多会导致TLE,所以要将连通区域的答案储存,下次查询到该连通 ...

  6. python3中post和get请求处理

    post 请求处理 def url(): url = "www.xxx.com.cn" data = { "csrfmiddlewaretoken":" ...

  7. Learn Python the Hard Way,ex37-1

    本练习为复习python的符号和关键字 关键字有: #and or False True print(1==0 and 2==0, 1==0 or 2==0) print(False) print(T ...

  8. 在linux下如何搭建jmeter的环境

    首先 我们可以选择不同版本的jmeter 转载原连接:https://blog.csdn.net/lyl0724/article/details/79474388 Jmeter历史版本下载地址 htt ...

  9. 订单退款&重复支付需求疑问点归纳整理

    更新历史记录: 更新内容 更新人 更新时间 新建 Young 2020.12.10  16:45 更新产品疑问解答 Young 2020.12.11  10:14 更新退款权益终止时间 Young 2 ...

  10. 代码审查:从 ArrayList 说线程安全

    本文从代码审查过程中发现的一个 ArrayList 相关的「线程安全」问题出发,来剖析和理解线程安全. 案例分析 前两天在代码 Review 的过程中,看到有小伙伴用了类似以下的写法: List< ...