首先,链表有以下特点:

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数据结构之链表(单链表、双向链表、循环链表)的更多相关文章

  1. js数据结构与算法--单链表的实现与应用思考

    链表是动态的数据结构,它的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(也称指针或链接)组成. 现实中,有一些链表的例子. 第一个就是寻宝的游戏.你有一条线索,这条线索是指向寻找下一条线 ...

  2. 数据结构——Java实现单链表

    一.分析 单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素.链表中的数据是以结点来表示的,每个结点由元素和指针构成.在Java中,我们可以将单链表定义成一个类,单链表的基 ...

  3. PHP数据结构之实现单链表

    学习PHP中,学习完语法,开始尝试实现数据结构,今天实现单链表 <?php class node //节点的数据结构 { public $id; public $name; public $ne ...

  4. Java数据结构——链表-单链表

    <1>链表 <2>引用和基本类型 <3>单链表 //================================================= // Fil ...

  5. C++ 数据结构学习二(单链表)

    模板类 //LinkList.h 单链表#ifndef LINK_LIST_HXX#define LINK_LIST_HXX#include <iostream>using namespa ...

  6. C#数据结构与算法系列(四):链表——单链表(Single-LinkedList)

    1.介绍: 链表是有序的列表,但是它在内存的存储如下:  链表是以节点的方式来存储,链式存储 每一个节点包含data域,next域:指向下一个节点 链表的各个节点不一定是连续存储 链表分带头节点的链表 ...

  7. 数据结构:DHUOJ 单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果)

    单链表ADT模板应用算法设计:长整数加法运算(使用单链表存储计算结果) 时间限制: 1S类别: DS:线性表->线性表应用 题目描述: 输入范例: -5345646757684654765867 ...

  8. 线性表->链式存储->线形链表(单链表)

    文字描述: 为了表示前后两个数据元素的逻辑关系,对于每个数据元素,除了存储其本身的信息之外(数据域),还需存储一个指示其直接后继的信息(即直接后继的存储位置,指针域). 示意图: 算法分析: 在单链表 ...

  9. pta 奇数值结点链表&&单链表结点删除

    本题要求实现两个函数,分别将读入的数据存储为单链表.将链表中奇数值的结点重新组成一个新的链表.链表结点定义如下: struct ListNode { int data; ListNode *next; ...

  10. 数据结构-多级指针单链表(C语言)

    偶尔看到大一时候写了一个多级链表,听起来好有趣,稍微整理一下. 稍微注意一下两点: 1.指针是一个地址,他自己也是有一个地址.一级指针(带一个*号)表示一级地址,他自身地址为二级地址.二级指针(带两个 ...

随机推荐

  1. linux driver error ------ 编译驱动出现 ERROR: Kernel configuration is invalid

       ERROR: Kernel configuration is invalid.         include/generated/autoconf.h or include/config/au ...

  2. python oracle使用心得

    Oracel安装(windows 64位) 1. 首先确定版本. 2. 下载instantclient,下载地址:http://www.oracle.com/technetwork/database/ ...

  3. <meta content='IE=edge,chrome=1' http-equiv='X-UA-Compatible' />

    代码一:<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"> http-eq ...

  4. 设置 Linux 服务器中 MySQL 允许远程访问

    开启 MySQL 远程访问权限: 在linux系统上登陆mysql服务. -- root 是用户名 [root@localhost ~]# mysql -u root -p Enter passwor ...

  5. AngulaJs -- 隔离作用域

    具有隔离作用域的指令最主要的使用场景是创建可复用的组件 创建具有隔离作用域的指令需要将scope属性设置为一个空对象{}.如果这样做了,指令的 模板就无法访问外部作用域了: <div ng-co ...

  6. es6笔记(3.1)三个点的“...”的作用

    展开运算符(spread operator) ES6中"..."的作用之一是,展开运算符. 顾名思义,它的作用是把某些结合数据展开. 在Array.Object.Set和Map上都 ...

  7. 在OS X 10.9配置WebDAV服务器联合NSURLSessionUploa…

    CHENYILONG Blog   在OS X 10.9配置WebDAV服务器联合NSURLSessionUploadTask实现文件上传iOS7推出的NSURLSession简化了NSURLConn ...

  8. 因子分析(Factor analysis)

    1.引言 在高斯混合和EM算法中,我们运用EM算法拟合混合模型,但是我们得考虑得需要多少的样本数据才能准确识别出数据中的多个高斯模型!看下面两种情况的分析: 第一种情况假如有 m 个样本,每个样本的维 ...

  9. Oracle错误及解决方案

    1.ORA-00257:归档程序错误.在释放之前仅限于内部链接 问题原因:归档日志占满了空间 解决方法: .增加归档日志空间 alter system set db_recovery_file_des ...

  10. python3之模板pycurl探测web服务质量

    1.pycurl简介 pycURL是libcurl多协议文件传输库的python接口,与urllib模块类似,PycURL可用于从python程序中获取由URL标识的对象,功能很强大,libcurl速 ...