function LinkedList() {
// 辅助类,表示加入链表的每一项
var Node=function(element){
this.element=element;
this.next=null;
}
// 列表,存储链表的长度
var length=0;
var head=null;
this.append=function(element){
var node=new Node(element),current;
if(head===null){
head=node;
}else{
current=head;
// 找到链表中的最后一个元素
while (current.next) {
current=current.next;
}
current.next=node;
}
length++;
};
this.insert=function(pos,element){
if (pos>=0 && pos<=length) {
var node=new Node(element),current=head,previous,index=0;
if(position===0){
node.next=current;
head=node;
}else{
while (index++<pos) {
previous=current;
current=current.next;
}
node.next=current;
previous.next=node;
}
length++;
return true;
}else{
return false;
}
};
this.removeAt=function(pos){
if(pos>-1 && pos<length){
var current=head,previous,index=0;
if(pos==0){
head=current.next;
}else{
while (index++<pos) {
previous=current;
current=current.next;
}
previous.next=current.next;
}
length--;
return current.element;
}else{
return null;
}
};
this.remove=function(element){
var index=this.indexOf(element);
return this.removeAt(index);//不太好,重复遍历了2次
};
this.indexOf=function (element) {
var current=head,index=0;
while (current) {
if(element===current.element){
return index;
}
index++;
current=current.next;
}
return -1;
};
this.isEmpty=function () {
return length===0;
};
this.size=function () {
return length;
};
this.toString=function(){
var current=head,str='';
while (current) {
str+=","+current.element;
current=current.next;
}
return str.slice(1);
};
this.print=function(){
console.log(this.toString());
};
this.getHead=function(){
return head;
}
}
function DoublyLinkedList() {
// 辅助类,表示加入链表的每一项
var Node=function(element){
this.element=element;
this.next=null;
this.prev=null;
}
// 列表,存储链表的长度
var length=0;
var head=null;
var tail=null;
this.append=function(element){
var node=new Node(element),current;
if(head===null){
head=node;
}else{
current=head;
// 找到链表中的最后一个元素
while (current.next) {
current=current.next;
}
current.next=node;
}
length++;
};
this.insert=function(pos,element){
if (pos>=0 && pos<=length) {
var node=new Node(element),current=head,previous,index=0;
if(pos===0){
if(!head){
head=node;
tail=node;
}else{
node.next=current;
current.prev=node;
head=node;
}
}else if(pos==length){
current=tail;
current.next=node;
node.prev=current;
tail=node;
}else{
while (index++<pos) {
previous=current;
current=current.next;
}
node.next=current;
node.prev=previous;
previous.next=node;
current.prev=node;
}
length++;
return true;
}else{
return false;
}
};
this.removeAt=function(pos){
if(pos>-1 && pos<length){
var current=head,previous,index=0;
if(pos==0){
head=current.next;
if(!length===1){
tail=null;
}else{
head.prev=null;
}
}else if(pos==length-1){
current=tail;
tail=current.prev;
tail.next=null;
}else{
while (index++<pos) {
previous=current;
current=current.next;
}
previous.next=current.next;
current.next.prev=current.prev;
}
length--;
return current.element;
}else{
return null;
}
};
this.remove=function(element){
var index=this.indexOf(element);
return this.removeAt(index);//不太好,重复遍历了2次
};
this.indexOf=function (element) {
var current=head,index=0;
while (current) {
if(element===current.element){
return index;
}
index++;
current=current.next;
}
return -1;
};
this.isEmpty=function () {
return length===0;
};
this.size=function () {
return length;
};
this.toString=function(){
var current=head,str='';
while (current) {
str+=","+current.element;
current=current.next;
}
return str.slice(1);
};
this.print=function(){
console.log(this.toString());
};
this.getHead=function(){
return head;
}
}

  

Javascript中的链表的更多相关文章

  1. javascript中的链表结构—从链表中删除元素

    1.概念 上一个博文我们讲到链表,其中有一个方法remove()是暂时注释的,这个方法有点复杂,需要添加一个Previous()方法找到要删除的元素的前一个节点,这一个博文我们来分析一下这个remov ...

  2. javascript中的链表结构

    1.定义 很多编程语言中数组的长度是固定的,就是定义数组的时候需要定义数组的长度,所以当数组已经被数据填满的时候,需要再加入新的元素就很困难.只能说在部分变成语言中会有这种情况,在javascript ...

  3. javascript中在链表中向前(向后)移动n个节点

     1.概念 在链表上移动n个节点,我第一眼看到这个需求的时候首先想到的是当前节点.使用这个当前节点作为参考来移动,没有这个当前节点的话是没有办法在链表上前进和后退的.初始化定义链表的时候定义一个当前节 ...

  4. javascript中的链表结构—双向链表

    1.概念 上一个文章里我们已经了解到链表结构,链表的特点是长度不固定,不用担心插入新元素的时候新增位置的问题.插入一个元素的时候,只要找到插入点就可以了,不需要整体移动整个结构. 这里我们了解一下双向 ...

  5. 学习javascript数据结构(二)——链表

    前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...

  6. JavaScript中的算法之美——栈、队列、表

    序 最近花了比较多的时间来学习前端的知识,在这个期间也看到了很多的优秀的文章,其中Aaron可能在这个算法方面算是我的启蒙,在此衷心感谢Aaron的付出和奉献,同时自己也会坚定的走前人这种无私奉献的分 ...

  7. JavaScript 中 4 种常见的内存泄露陷阱

    了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读一读吧 ...

  8. JavaScript中的内存泄漏以及如何处理

    随着现在的编程语言功能越来越成熟.复杂,内存管理也容易被大家忽略.本文将会讨论JavaScript中的内存泄漏以及如何处理,方便大家在使用JavaScript编码时,更好的应对内存泄漏带来的问题. 概 ...

  9. JavaScript 中常见的内存泄露陷阱(摘)

    内存泄露是每个开发者最终都不得不面对的问题.即便使用自动内存管理的语言,你还是会碰到一些内存泄漏的情况.内存泄露会导致一系列问题,比如:运行缓慢,崩溃,高延迟,甚至一些与其他应用相关的问题. 什么是内 ...

随机推荐

  1. GPS部标平台的架构设计(九)-GPS监控客户端设计

    交通部的部标过检,所有的测试都是从客户端发起的,也是在客户端体现的,在客户端承载了部标标准所要求的所有的功能,是整个部标平台当中工作量最大的部分,也是最繁琐的部分. 客户端设计面临两个问题: 1.基于 ...

  2. MVC中权限管理

    权限管理,一般指根据系统设置的安全规则或者安全策略,用户可以访问而且只能访问自己被授权的资源,不多不少.权限管理几乎出现在任何系统里面,只要有用户和密码的系统.权限管理还是比较复杂的,有的固定到某个模 ...

  3. jtree添加节点

    利用Model添加了节点之后,需要reload树

  4. android nfc中Ndef格式的读写

    1. 在onCreate()中获取NfcAdapter对象: NfcAdapter nfcAdapter = NfcAdapter.getDefaultAdapter(this); 2.在onNewI ...

  5. 。。。学习CSS3的第一个属性border-radius。。。

    学习border-radius,感觉这个文档写的很不错: http://blog.sina.com.cn/s/blog_61671b520101gelr.html

  6. Unreleased Resource(未释放资源)-Streams(流)

    java中把不同的输入/输出源(键盘.文件.网络连接等)抽象表现为Stream(流). java程序可以通过使用不同的流来访问不同的输入/输出源.而Stream(流)可以直观的理解为从数据的源(Sou ...

  7. C++预定义字符函数

    利用 get 成员函数可读取文件中的一切字符,包括空白字符.文件结尾.用 >> 读取文件,会自动忽略空白字符(空格.换行符.制表符) C++ 预定义的字符函数(均在 cctype 库中定义 ...

  8. Ubuntu14.04安装CMake3.6.3

    准备工作:官网下载cmake-3.6.3.tar.gz(https://cmake.org/download/) 1.解压文件tar -xvf cmake-3.6.3.tar.gz,并修改文件权限ch ...

  9. Objective-C基础2

    16.继承 1)不能和父类定义一样的变量 2)单一继承,不支持继承多个类 3)支持多层继承子类也可以被继承 17.实例变量修饰符 public:公开的,在其他类中也可以访问 protected:受保护 ...

  10. Spring源代码解析

    Spring源代码解析(一):IOC容器:http://www.iteye.com/topic/86339 Spring源代码解析(二):IoC容器在Web容器中的启动:http://www.itey ...