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.指针是一个地址,他自己也是有一个地址.一级指针(带一个*号)表示一级地址,他自身地址为二级地址.二级指针(带两个 ...
随机推荐
- box-sizing border-box 的理解
http://blog.csdn.net/isaisai/article/details/20449827 -webkit-box-sizing: border-box; 则div 设置的宽高将包含 ...
- Tomcat get 中文乱码
乱码问题 原因: tomcat默认的在url传输时是用iso8859-1编码. 解决方案一: 在使用get传输参数时,将参数中的中文转换成url格式,也就是使用urlEncode和urlDecode来 ...
- 赫夫曼树JAVA实现及分析
一,介绍 1)构造赫夫曼树的算法是一个贪心算法,贪心的地方在于:总是选取当前频率(权值)最低的两个结点来进行合并,构造新结点. 2)使用最小堆来选取频率最小的节点,有助于提高算法效率,因为要选频率最低 ...
- 微信公众号用户OpenID同步导出系统
一.简介 同步公众账号用户信息,包括OpenID.昵称.头像.地区等. 二.主要功能 同步公众账号用户 OpenID,以及昵称.头像.性别.地区.关注时间等,支持认证订阅号.认证服务号. 支持超过1万 ...
- html之div始终停留在屏幕中间部分
需求: 使得某一个div始终停留在屏幕中间 实现: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" ...
- 01:MFC应用程序编程
一 MFC的发展 VC 1.0->VC 5.0->VC 6.0->VC2008 SP1)->VS2010 二 MFC基础 1 MFC 微软基础类库 采用类的方式,将Win32 ...
- HDU 1867 A + B for you again 字符匹配
解题报告:给你两个字符串,让你连接起来,没有前后顺序,要求是长度最短优先,其次是字典序最小.这题我用的是KMP,做两次匹配,分别把第一次跟第二次输入的字符串放前面,然后比较两次得到的字符窜的长度和字典 ...
- Nuts & Bolts Problem
Given a set of n nuts of different sizes and n bolts of different sizes. There is a one-one mapping ...
- mysql主键的缺少导致备库hang
最近线上频繁的出现slave延时的情况,经排查发现为用户在删除数据的时候,由于表主键的主键的缺少,同时删除条件没有索引,或或者删除的条件过滤性极差,导致slave出现hang住,严重的影响了生产环境的 ...
- Linux下USB suspend/resume源码分析【转】
转自:http://blog.csdn.net/aaronychen/article/details/3928479 Linux下USB suspend/resume源码分析 Author:aaron ...