链表相比数组更具灵活性和扩展性。主要有节点数据以及指向节点的指针所构成。

链表中节点的实现【元素和指针】:

        let Node = function( element ){
this.element = element;
this.next = null;
};

单链表的实现:

function LinkedList(){
let Node = function( element ){
this.element = element;
this.next = null;
}; let head = null;
let length = 0; this.append = function( element ){
let newNode = new Node( element );
let current = null;
if( head == null ){
head = newNode;
}else{
current = head;
while( current.next ) {
current = current.next;
}
current.next = newNode;
}
length++;
}; this.size = function(){
return length;
}; this.removeAt = function( pos ){
if( pos > -1 && pos < length ){
var current = head,
index = 0,
prev = null; if( pos == 0 ){
head = current.next;
}else{
while( index++ < pos ){
prev = current;
current = current.next;
}
prev.next = current.next;
length--;
return current.element;
}
}else{
return null;
}
}; this.print = function(){
let current = head;
while( current ){
console.log( current.element );
current = current.next;
}
}; this.insert = function( pos, element ){
let newNode = new Node( element );
let current, prev, index = 0;
current = head;
if( pos >= 0 && pos <= length ){
if( pos == 0 ){
newNode.next = head;
head = newNode;
}else{
while( index++ < pos ){
prev = current;
current = current.next;
}
newNode.next = current;
prev.next = newNode;
}
length++;
return true;
}else {
return false;
}
};
this.toString = function(){
let current = head, string = '';
while( current ){
string += current.element + ',';
current = current.next;
}
return string.substring( 0, string.length - 1 );
};
this.indexOf = function( element ){
let current = head, index = -1;
while( current ){
index++;
if( current.element == element ){
return index;
}
current = current.next;
}
return -1;
};
this.remove = function( element ){
let pos = this.indexOf( element );
return this.removeAt( pos );
};
this.isEmpty = function(){
return length == 0;
};
this.getHead = function(){
return head;
}
} var oLink = new LinkedList();
oLink.append( "java" );
oLink.append( "php" );
oLink.append( "javascript" );
oLink.append( "python" ); oLink.print();
console.log( "-----------------------节点个数------------------------")
console.log( oLink.size() ); console.log( "-----------------------删除第2个元素之前------------------------")
console.log( oLink.removeAt( 2 ) );
console.log( "-----------------------删除第2个元素之后------------------------")
oLink.print();
console.log( "节点个数");
console.log( oLink.size() );
console.log( "-----------------------插入节点前------------------------")
oLink.insert( 0, "c语言" );
oLink.insert( 3, "c++语言" );
console.log( "-----------------------插入节点后------------------------")
oLink.print();
oLink.insert( 4, "erlang语言" );
console.log( "-----------------------插入节点后------------------------")
oLink.print();
console.log( "-----------------------节点个数------------------------")
console.log( oLink.size() ); console.log( "-----------------------toString------------------------")
console.log( oLink.toString() );
console.log( "------------------------indexOf-----------------------" );
console.log( oLink.indexOf( "c语言2" ) );
console.log( "------------------------clear-----------------------" );
oLink.print();

javascript算法-单链表的更多相关文章

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

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

  2. 数据结构&算法-单链表

    1.引言 工作一年了,感觉越来越懒散,把很多基础性的东西都慢慢遗忘了,最近想趁着还没忘完,回顾一下,整理了点笔记,分享一下. 如有错的地方,欢迎大家怒喷. 2.学习 我们就从最简单的链表开始吧. 链表 ...

  3. [算法] 单链表插入排序(java)

    实现 首先保证插入前的链表是个完整的,最后一个节点要断开 然后在插入前链表中找到比待插入节点大的最小元素,插到前面即可 Link.java class Link { private class Nod ...

  4. javascript实现数据结构与算法系列:线性表的静态单链表存储结构

    有时可借用一维数组来描述线性链表,这就是线性表的静态单链表存储结构. 在静态链表中,数组的一个分量表示一个结点,同时用游标(cur)代替指针指示结点在数组中的相对位置.数组的第0分量可看成头结点,其指 ...

  5. 数据结构算法C语言实现(二)---2.3线性表的链式表示和实现之单链表

    一.简述 [暂无] 二.头文件 #ifndef _2_3_part1_H_ #define _2_3_part1_H_ //2_3_part1.h /** author:zhaoyu email:zh ...

  6. Reverse反转算法+斐波那契数列递归+Reverse反转单链表算法--C++实现

    Reverse反转算法 #include <iostream> using namespace std; //交换的函数 void replaced(int &a,int & ...

  7. C++ 单链表的基本算法

    线性表是最简单,最常用的一种数据结构.线性表的逻辑结构是n个数据元素的有限序列(a1,a2,…,an).而线性表的物理结构,我们已经学习过顺序表,也就是数组 :另一种线性表的物理结构——链表 . 什么 ...

  8. 特殊的反转单链表算法(C++)

    普通的单链表反转算法 大学的时候也做过好几次单链表的反转,记得当时都是用三个变量不断修改next的值然后实现反转. ListNode* reverseList(ListNode* head) { Li ...

  9. cc150:实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针

    实现一个算法来删除单链表中间的一个结点,仅仅给出指向那个结点的指针. 样例: 输入:指向链表a->b->c->d->e中结点c的指针 结果:不须要返回什么,得到一个新链表:a- ...

随机推荐

  1. Java并发编程:Synchronized底层优化(偏向锁、轻量级锁)

    Java并发编程系列: Java 并发编程:核心理论 Java并发编程:Synchronized及其实现原理 Java并发编程:Synchronized底层优化(轻量级锁.偏向锁) Java 并发编程 ...

  2. JavaScript之DOM创建节点

    上几篇文章中我们罗列了一些获取HTML页面DOM对象的方法,当我们获取到了这些对象之后,下一步将对这些对象进行更改,在适当的时候进行对象各属性的修改就形成了我们平时看到的动态效果.具体js中可以修改D ...

  3. 《http权威指南》读书笔记17

    概述 最近对http很感兴趣,于是开始看<http权威指南>.别人都说这本书有点老了,而且内容太多.我个人觉得这本书写的太好了,非常长知识,让你知道关于http的很多概念,不仅告诉你怎么做 ...

  4. 第七篇: 消息总线(Spring Cloud Bus)

    Spring Cloud Bus 将分布式的节点用轻量的消息代理连接起来.它可以用于广播配置文件的更改或者服务之间的通讯,也可以用于监控.本文要讲述的是用Spring Cloud Bus实现通知微服务 ...

  5. Python shuffle() 函数

    描述 shuffle() 方法将序列的所有元素随机排序. 语法 以下是 shuffle() 方法的语法: import random random.shuffle (lst ) 注意:shuffle( ...

  6. vue中复选框全选与反选

    html主要部分: <template v-for="(item, index) in checkboxList"> <input type="chec ...

  7. 微信小程序入门(三)

    11.开发框架基本介绍 四个组成部分,其它三个前面介绍过了,主要WXS: WXS:对wxml增强的一种脚本语言,可以对请求的数据进行filter或者做计算处理,帮助wxml快速构建出页面结构. 12. ...

  8. Azure认知服务之Face API上手体验

    Azure认知服务:Face API Face API是Azure认知服务之一,Face API有两个主要功能: 人脸检测 Face API可在图像中以高精度人脸位置检测多达64个人脸.图像可以通过文 ...

  9. mysql 开发进阶篇系列 21 磁盘I/O问题(RAID)

    一.概述 作为应用系统的持久化层,不管数据库采取了什么样的Cache机制,数据库最终总是要将数据储存到可以长久保存的I/O设备磁盘上.但磁盘的存取速度显然要比cpu,ram的速度慢很多.因此,对于比较 ...

  10. Struts1入门实例(简单登录)

    Struts1入门实例(简单登录) 现在开始加入公司的核心项目,但由于项目开发比较早,所以使用的技术不是很新潮,前台用的还是struts1. 虽然不是什么新技术,但仍可以从中学到好多东西的.花了一个晚 ...