链表

链表存储有序的元素集合,但不同于数组,链表中的元素在内存中并不是连续放置的。每个元素由一个存储元素本事的节点和一个指向下一个元素的引用组成。相对于传统的数组,链表的一个好处在于,添加或者删除元素的时候不需要移动其他元素。
使用链表结构可以克服数组需要预先知道数据大小的缺点(C语言的数组需要预先定义长度),链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。

数组和链表的一个不同在于数组可以直接访问任何位置的元素,而想要访问链表中的一个元素,需要从起点开始迭代列表。

链表又包括:单向链表 和 双向链表;

单向链表

链表中最简单的形式就是单向链表,链表中的节点都包含两个部分,第一部分储存着自身信息,第二部分则储存有指向下一节点的指针。最后一个节点则指向NULL,如图所示:


让我们来简单实现一个单向链表类,并包含如下功能:

  • append(element): 添加元素到链表尾部

  • insert(position,element): 向单向链表中某个位置插入元素

  • indexOf(element): 寻找某个元素在单向链表中的位置

  • remove(element): 移除给定的元素

  • removeAt(position): 移除单向链表中某个位置的元素

  • getHead(): 获取单向链表的头部

  • isEmpty(): 检查单向链表是否为空,为空则返回true

  • toString(): 将链表所有内容以字符串输出

  • size(): 返回单向链表长度

代码如下:

 function LinkedList() {/*** 单向链表节点的构造函数* * @param {any} element 要传入链表的节点*/var Node = function (element) {this.element = element;this.next = null;}// 单向链表的长度var length = 0;// 单向链表的头节点,初始化为nullvar head = null;/*** 添加元素到链表尾部* * @param {any} element 要传入链表的节点*/this.append = function(element) {var node = new Node(element),current;if (head === null) {head = node} else {current = head;// 当next为null时,退出循环while (current.next) {current = current.next;}current.next = node;}length++;}/*** 向单向链表中某个位置插入元素* * @param {any} position 位置* @param {any} element 要传入链表的节点*/this.insert = function (position, element) {var node = new Node(element),current = head,previous,index;// 验证边界if (position < 0 || position >= length) {return false;}// 在链表头部插入if (position === 0) {node.next = current;head = node;} else {// 在链表除头部之外的地方插入(中间 or 末尾)while (index++ < position) {previous = currentcurrent = current.next}// 在前一个节点和当前节点中间插入node.next = current;previous.next = node;}length++;return true;}/*** 寻找某个元素在单向链表中的位置* * @param {any} element 要寻找的节点* @returns {Number} 返回值>=0则代表找到相应位置*/this.indexOf = function (element) {var index = 0,current = head;while (current) {if (element === current.element) {return index}index++;current = current.next;}// 如果链表中不存该元素,返回-1return -1;}/*** 移除单向链表中某个位置的元素* * @param {any} position 要移除的位置*/this.removeAt = function (position) {var index = 0,previous,current = head;if (position < 0 || position >= length) {return null;}if (position === 0) {head = head.next;} else {while (index++ < position) {previous = current;current = current.next;}previous.next = current.next;}length--;return current.element;}/*** 移除给定的元素* * @param {any} element 要移除的节点* @returns */this.remove = function (element) {var index = this.indexOf(element);return this.removeAt(index)}/*** 获取单向链表的头部* */this.getHead = function () {return head.element}/*** 检查单向链表是否为空* * @returns 为空则返回true*/this.isEmpty = function () {return length === 0}/*** 返回单向链表长度* * @returns {Number}*/this.size = function () {return length;}/***  将链表所有内容以字符串输出* * @returns {String}*/this.toString = function () {var str = '',current = head;while(current) {str += current.element;current = current.next;}return str;}
}

JavaScript的数据结构与算法(三) —— 单向链表相关推荐

  1. node 获取表单数据 为空_数据结构与算法(python)单向链表篇

    链表 数据表的构建需要预先知道数据的大小来申请连续的存储空间, 而在进行扩充的时候又需要进行数据的搬迁, 使用起来不是很灵活. 链表结构可以充分利用计算机内存空间, 实现灵活的内存动态管理. 简单来说 ...

  2. java 快速从树节点找到数据_数据结构与算法:单向链表和双向链表

    一.链表简介 1.链表概念 链表是一种物理存储单元上非连续.非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的.链表由一系列节点组成,节点可以在运行时动态生成,节点包括两个部分:一个 ...

  3. Java数据结构与算法-SingleLinkedList单向链表插入,删除,查找,修改详解及代码

    SingleLinkedList单向链表插入,删除,查找,修改详解及代码 单向链表学习目标 1. 链表的介绍 2. 单向链表的存储特点以及原理 3. 基本操作:插入,删除等 4. 单向链表应用场景举例 ...

  4. python数据结构与算法:单向链表

    单链表:python实现及其对应的 增删查检 操作 ##################### P4.1-P4.8 单向链表 ########################### #coding:u ...

  5. 【数据结构与算法】单向链表的实现

  6. Javascript的数据结构与算法(一)

    1数组 1.1方法列表 数组的常用方法如下: concat: 链接两个或者更多数据,并返回结果. every: 对数组中的每一项运行给定的函数,如果该函数对每一项都返回true,则返回true. fi ...

  7. java数据结构与算法之双链表设计与实现

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/53047590 出自[zejian的博客] 关联文章: java数据结 ...

  8. C语言随笔小算法:单向链表

    C语言随笔小算法:单向链表 参考链接: 代码参考:https://blog.csdn.net/go_sann/article/details/80508284 原理参考:https://blog.cs ...

  9. 数据结构与算法(三) 排序算法(代码示例)

    数据结构与算法三 排序算法 1. 选择排序 2. 插入排序 3. 冒泡排序 4. 归并排序 5. 快速排序 6. 希尔排序 7. 堆排序 总结 1. 选择排序 选择排序的基本原理: 对于未排序的一组记 ...

  10. 数据结构与算法:企业级链表实现(超详细)

    企业级链表介绍 如果我们使用原始的C语言写链表的话,数据类型是被固定死的,如果业务换了 需要另一种数据类型,我们又得重新在写一个链表,当然我们可以使用void* 万能指针,因为void* 可以接受任意 ...

最新文章

  1. 解决intellij IEDA mapper.xml文件警告以及could not autowire的错误提示
  2. windows10mysql安装包_windows10上安装mysql8(zip包)
  3. python flask高级编程之restful_flask-restful使用总结
  4. 终于搞懂了网红主播的套路
  5. 信息抽取 | 72篇论文梳理:涉及NER、复杂关系、小样本、文档级、多模态、开放域抽取...
  6. AIDA64 Business Edition(系统检测)多国语言绿色特别
  7. vue2.x 微信公众号授权拿取code,静默登录
  8. 抖音测试美甲软件,抖音最火的美甲
  9. EEG中的EOG伪迹
  10. Activity5概述
  11. Games104 gameplay系统笔记
  12. 常见二维码上那些奇怪的图案是什么
  13. 外设驱动库开发笔记51:SDP800差压传感器驱动
  14. 使用PE工具制作U盘启动盘
  15. 微信公众号采集,历史文章采集,万能key采集,点赞阅读评论采集
  16. source not found解决方法(亲测)
  17. 基于单片机波形发生器PCB原理图报告设计资料-基于单片机比赛计时计分电路仿真设计-基于单片机报警器与旋转灯设计-基于单片机八路数据电压采集报警控制系统-基于单片机病房呼叫系统控制系统设计【毕设课设资】
  18. 网络职业成长规划经验谈
  19. 【02】从零开始跟我一起制作一个鸿蒙的应用-★运行项目测试测试★---优雅草科技伊凡
  20. 在线学生计算机,计算机学生顶岗实习计划(网络版)

热门文章

  1. WPF: 使用CommandManager.InvalidateRequerySuggested手动更新Command状态
  2. 奉献一个窗口置顶的小工具
  3. centos下离线安装mysql
  4. Hive内部表与外部表区别详细介绍
  5. python 常量 模块_Python字符串模块的有用常量
  6. mac wordpress php7,Mac 下基于 wordpress 搭建个人博客系统
  7. android标题栏的属性,android – 属性“titleTextStyle”已经定义?
  8. c语言程序设计实验周信东指针,C语言程序设计实验4数组周信东
  9. activiti 工作流_分享:springboot中关于工作流activiti的搭建
  10. 计算机专业刚毕业本科生,计算机专业应届本科毕业生自我鉴定