js数据结构之链表(单链表、双向链表、循环链表)
首先,链表有以下特点:
1. 存储空间不固定,可灵活扩充
2.方便多次的插入和删除,效率较高
单链表
单链表是最常用的链表,其对数据的操作均为单项的,向后查找的。
/*
链表(基于对象) 此处为单链表
*/
function Node (ele) {
this.element = ele;
this.next = null;
} function LinkedList () {
this.head = new Node("head"); // 头结点
this.find = find; // 根据element值查找节点
this.findPrevious = findPrevious;
this.insert = insert;
this.remove = remove;
this.display = display;
} function find (item) {
var currNode = this.head;
while(currNode.element !== item) {
if(currNode.next === null) {
return false;
}
currNode = currNode.next;
}
return currNode;
} function findPrevious (item) {
var currNode = this.head;
while(currNode.next!==null&& currNode.next.element!=item){
currNode = currNode.next;
}
return currNode;
} function insert (newEleContent, item) {
var newNode = new Node(newEleContent);
var currNode = this.find(item);
newNode.next = currNode.next;
currNode.next = newNode;
} function display () {
var currNode = this.head;
while(currNode.next !== null){
console.log(currNode.next.element)
currNode = currNode.next;
}
} function remove (item) {
var currNode = this.find(item);
var previousNode = this.findPrevious(currNode.element);
previousNode.next = currNode.next;
currNode = null;
}
双向链表
双向链表可以方便地对数据进行向前和向后查找(操作),如播放器正向播放音乐时用户存在上一曲和下一曲的操作需要,此时就用到了双向链表。
function Node (ele) {
this.element = ele;
this.next = null;
this.previous = null;
}
function DuplexLinkedList () {
this.head = new Node("head");
this.find = find;
this.findLast = findLast;
this.remove = remove;
this.insert = insert;
this.display = display;
this.displayReverse = displayReverse;
}
function find (item) {
var currNode = this.head;
while (currNode.element!==item) {
currNode = currNode.next;
}
return currNode;
}
function remove (item) {
var currNode = this.find(item);
currNode.previous.next = currNode.next;
if(currNode.next){
currNode.next.previous = currNode.previous;
}
currNode = null;
}
function insert (eleContent, item) {
var newNode = new Node(eleContent);
var currNode = this.find(item);
// 先操作新节点,否则会进死循环
newNode.previous = currNode;
newNode.next = currNode.next;
currNode.next = newNode;
if(currNode.next.previoue){
currNode.next.previous = newNode;
}
console.log(newNode);
}
function findLast () {
var currNode = this.head;
while(currNode.next!==null){
currNode = currNode.next;
}
return currNode;
}
function display () {
var currNode = this.head;
while (currNode.next!==null){
console.log(currNode.next.element);
currNode = currNode.next;
}
}
function displayReverse () {
var currNode = this.findLast();
console.log(currNode);
while(currNode.previous!==null){
console.log(currNode.element);
currNode = currNode.previous;
}
}
循环链表
同理,循环链表是单向的,但是可以循环地查找。例如解决约瑟夫环问题
function Node (ele) {
this.element = ele;
this.next = null;
}
//循环链表需要将this.head.next指向this.head
function CirLinkedList () {
this.head = new Node("head");
this.head.next = this.head;
this.find = find;
this.findPrevious = findPrevious;
this.insert = insert;
this.remove = remove;
this.display = display;
}
function find (item) {
var currNode = this.head;
while(currNode.element !== item) {
if(currNode.next === null) {
return false;
}
currNode = currNode.next;
}
return currNode;
}
function findPrevious (item) {
var currNode = this.head;
while(currNode.next!==null&& currNode.next.element!==item){
currNode = currNode.next;
}
return currNode;
}
function insert (newEleContent, item) {
var newNode = new Node(newEleContent);
var currNode = this.find(item);
newNode.next = currNode.next;
currNode.next = newNode;
console.log(newNode);
}
function display () {
var currNode = this.head;
// 循环输出判断需要增加next是不是头节点
while(currNode.next.element != "head" && currNode.next.element!=="head" ){
console.log(currNode.next.element);
currNode = currNode.next;
}
}
function remove (item) {
var currNode = this.find(item);
var previousNode = this.findPrevious(currNode.element);
previousNode.next = currNode.next;
currNode = null;
}
js数据结构之链表(单链表、双向链表、循环链表)的更多相关文章
- js数据结构与算法--单链表的实现与应用思考
链表是动态的数据结构,它的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成. 现实中,有一些链表的例子. 第一个就是寻宝的游戏.你有一条线索,这条线索是指向寻找下一条线 ...
- 数据结构——Java实现单链表
一.分析 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点由元素和指针构成.在Java中,我们可以将单链表定义成一个类,单链表的基 ...
- PHP数据结构之实现单链表
学习PHP中,学习完语法,开始尝试实现数据结构,今天实现单链表 <?php class node //节点的数据结构 { public $id; public $name; public $ne ...
- Java数据结构——链表-单链表
<1>链表 <2>引用和基本类型 <3>单链表 //================================================= // Fil ...
- C++ 数据结构学习二(单链表)
模板类 //LinkList.h 单链表#ifndef LINK_LIST_HXX#define LINK_LIST_HXX#include <iostream>using namespa ...
- C#数据结构与算法系列(四):链表——单链表(Single-LinkedList)
1.介绍: 链表是有序的列表,但是它在内存的存储如下: 链表是以节点的方式来存储,链式存储 每一个节点包含data域,next域:指向下一个节点 链表的各个节点不一定是连续存储 链表分带头节点的链表 ...
- 数据结构:DHUOJ 单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果)
单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果) 时间限制: 1S类别: DS:线性表->线性表应用 题目描述: 输入范例: -5345646757684654765867 ...
- 线性表->链式存储->线形链表(单链表)
文字描述: 为了表示前后两个数据元素的逻辑关系,对于每个数据元素,除了存储其本身的信息之外(数据域),还需存储一个指示其直接后继的信息(即直接后继的存储位置,指针域). 示意图: 算法分析: 在单链表 ...
- pta 奇数值结点链表&&单链表结点删除
本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中奇数值的结点重新组成一个新的链表.链表结点定义如下: struct ListNode { int data; ListNode *next; ...
- 数据结构-多级指针单链表(C语言)
偶尔看到大一时候写了一个多级链表,听起来好有趣,稍微整理一下. 稍微注意一下两点: 1.指针是一个地址,他自己也是有一个地址.一级指针(带一个*号)表示一级地址,他自身地址为二级地址.二级指针(带两个 ...
随机推荐
- eos源码剖析之controller
controller::block_status,区块状态枚举类,包括: irreversible = 0,该区块已经被当前节点应用,并且被认为是不可逆的.validated = 1,这是由一个有效生 ...
- Maven的国内镜像(解决jar下载过慢)
Maven简介 maven作为一个项目管理工具确实非常好用,结果在使用时候,你会发现下载jar速度不如自己在网上下载.之前oschina的中央仓库可用,现在oschina的maven服务器关了,只能拿 ...
- dedecms在linux上安装提示没权限解决办法
web服务器运行的用户与目录所有者用户必须不一样,比如apache运行的用户为root,那么网站目录设置的所有者就应该不能设置为root,而是设置不同于root的用户,如apache. 我们这里假设w ...
- [转载]HTML5浏览器测试网站汇总
http://www.cnblogs.com/javawebsoa/archive/2012/04/19/2458224.html 浏览器支持情况统计 When Can IUse:图表经常更新,展示了 ...
- 20155203 2016-2017-3 《Java程序设计》第5周学习总结
20155203 2016-2017-3 <Java程序设计>第5周学习总结 教材学习内容总结 课堂知识总结 封装是继承的基础,继承是多态的基础.多态是用父类声明对象的引用,用子类生成对象 ...
- 爬虫笔记之刷小怪练级:yymp3爬虫(音乐类爬虫)
一.目标 爬取http://www.yymp3.com网站歌曲相关信息,包括歌曲名字.作者相关信息.歌曲的音频数据.歌曲的歌词数据. 二.分析 2.1 歌曲信息.歌曲音频数据下载地址的获取 随便打开一 ...
- NVIDIA / Intel 核芯显卡显示 + Nvidia 计算
今天折腾了好久intel集成显卡显示.最后好不容易才全部搞定,这里记录一下. 1. 首先在BIOS里是要打开Intel 核芯显卡的.我把它设置成了主显卡,显示器也接到核心显卡的口上. 重启后, I ...
- sort命令的k选项大讨论【转】
本原创文章属于<Linux大棚>博客,博客地址为http://roclinux.cn.文章作者为rocrocket. 为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅. ...
- 一些对外的服务(例如lnmp)都不用root执行
lnmp lamp等需要对外的服务,都不用root用户执行进程 缺点: 如果php程序使用root运行,万一你的程序有漏洞,被拿到了web shell,那么黑客将直接拥有root权限进入你的系统 对于 ...
- CentOS7上安装与配置Tomcat8与MySQL5.7
一.安装tomcat Tomcat 的安装依赖 JDK,在安装 Tomcat 之前需要先安装 Java JDK.输入命令 java -version,如果显示 JDK 版本,证明已经安装了 JDK.