1.前言

用JS实现一个简单的单向链表,并完成相关的功能

2.功能说明

  1. push(value):从链表尾部添加一个新的节点
  2. insertAfer(value,item):向链表中的item节点之后插入一个 值为value的新节点
  3. remove(value):删除链表中值为value的节点
  4. removeAt(pos):删除链表中第pos个节点
  5. find(value):查找链表中值为value的节点
  6. findPrevious(value):查找链表中值为value的节点的前一个节点
  7. indexof(vallue):查找链表中值为value的节点的索引值,如果查找不到则返回-1
  8. size():获取当前链表的长度
  9. getHead():获取当前链表的头节点
  10. print():打印当前链表,供测试用

3. 代码实现

3.1 创建链表类

 //创建一个Node辅助类,用来生成节点
function Node(value) {
this.value = value;
this.next = null;
} //链表类
function LinkedList() {
this.head = null;
this.length = 0;
//向链表尾部追加元素
this.push = push;
//从链表中查找某个元素
this.find = find;
//在链表中任意一个元素之后插入一个元素
this.insertAfter = insertAfter;
//从链表中查找任意元素节点的前一个节点
this.findPrevious = findPrevious;
//从链表中删除值为value的元素
this.remove = remove;
//返回当前链表的长度
this.size = size;
//查找某个元素在链表中的索引值
this.indexof = indexof;
//删除链表中第pos个元素
this.removeAt = removeAt;
//获取链表中第一个元素
this.getHead = getHead;
//打印当前的链表,供测试用
this.print = print;
}

2.1 push(value):从链表尾部添加一个新的节点

function push(value) {
var node = new Node(value);
if (this.head == null) {
this.head = node;
} else {
var current = this.head;
while (current.next != null) {
current = current.next;
}
current.next = node;
}
length++;
}

3.3 insertAfer(value,item):向链表中的item节点之后插入一个 值为value的新节点

function insertAfter(value, item) {
var node = new Node(value);
var current = this.find(item);
if (current == null) {
return console.log('找不到元素');
}
node.next = current.next;
current.next = node;
length++;
}

3.4 remove(value):删除链表中值为value的节点

function remove(value) {
  var current = this.find(value);
  if (!current) {
    return console.log('链表中找不到被删除的元素');
  }
  var previous = this.findPrevious(value);
  if (!previous) {
    this.head = current.next;
  } else {
    previous.next = current.next;
  }
  this.length--;
}

3.5 removeAt(pos):删除链表中第pos个节点

function removeAt(pos) {
if (pos > -1 && pos < length) {
var current = this.head;
var index = 0;
if (pos === 0) {
this.head = current.next;
} else {
while (index < pos) {
var previous = current;
current = current.next;
index++;
}
previous.next = current.next;
}
length--;
} else {
return null;
}
}

3.6 find(value):查找链表中值为value的节点

function find(value) {
var currentNode = this.head;
if (currentNode == null) {
console.log("这是一个空链表!!!");
return null;
}
if (currentNode.value === value) {
return currentNode;
}
while (currentNode.next) {
currentNode = currentNode.next;
if (currentNode.value === value) {
return currentNode
}
}
console.log("没有找到该元素!!!");
return null;
}

3.7 findPrevious(value):查找链表中值为value的节点的前一个节点

function findPrevious(value) {
  var current = this.head;
  if (current == null) {
    console.log('这是一个空链表');
    return null;
  }
  if (current.value === value) {
    console.log('当前查找的节点为链表的头节点,头节点前再无节点');
    return null;
  }
  while (current.next) {
    if (current.next.value === value) {
      return current;
    }
    current = current.next;
  }
  console.log('找不到该元素的前一个元素');
  return null;
}

3.7 indexof(vallue):查找链表中值为value的节点的索引值,如果查找不到则返回-1

function indexof(value) {
var current = this.head;
var index = 0;
if (current == null) {
return null;
} else {
while (current) {
if (current.value === value) {
return index;
}
index++;
current = current.next;
}
}
return -1;
}

3.8 size():获取当前链表的长度

function size(){
return length;
}

3.9 getHead():获取当前链表的头节点

function getHead(){
return this.head;
}

3.10 print():打印当前链表,供测试用

function print() {
var current = this.head;
while (current != null) {
console.log(current.value);
current = current.next;
}
}

4. 功能测试

var list = new LinkedList();
for (var i = 1; i < 6; i++) {
list.push(i);
}
list.print();

5.完整代码

完整代码请戳☞☞☞LinkedList.js

(完)

原生JS实现单向链表的更多相关文章

  1. JS实现单向链表、双向链表、循环链表

    https://cloud.tencent.com/developer/article/1114246 链表存储有序的元素的集合,但是和数组不同的是,链表中的元素在内存中的存储并不是连续的.每一个链表 ...

  2. JS数据结构与算法--单向链表

    链表结构:链表中每个元素由一个存储元素本身的节点和一个指向下一元素的引用组成.如下所示(手画的,比较丑,懒得用工具画了,嘻嘻) 1.append方法,向链表末尾插入一个节点 2.insert(posi ...

  3. 原生js实现数据双向绑定

    最近接触了vue,在谈到vue等等的mvvm框架之前,先了解什么是数据双向绑定以及如何利用原生JS实现数据双向绑定 单向数据绑定 指先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HT ...

  4. 原生JS封装Ajax插件(同域&&jsonp跨域)

    抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...

  5. 常用原生JS方法总结(兼容性写法)

    经常会用到原生JS来写前端...但是原生JS的一些方法在适应各个浏览器的时候写法有的也不怎么一样的... 今天下班有点累... 就来总结一下简单的东西吧…… 备注:一下的方法都是包裹在一个EventU ...

  6. 原生JS实现"旋转木马"效果的图片轮播插件

    一.写在最前面 最近都忙一些杂七杂八的事情,复习软考.研读经典...好像都好久没写过博客了... 我自己写过三个图片轮播,一个是简单的原生JS实现的,没有什么动画效果的,一个是结合JQuery实现的, ...

  7. 再谈React.js实现原生js拖拽效果

    前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目 ...

  8. React.js实现原生js拖拽效果及思考

    一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...

  9. 原生JS实现全屏切换以及导航栏滑动隐藏及显示——重构前

    思路分析: 向后滚动鼠标滚轮,页面向下全屏切换:向前滚动滚轮,页面向上全屏切换.切换过程为动画效果. 第一屏时,导航栏固定在页面顶部,切换到第二屏时,导航条向左滑动隐藏.切换回第一屏时,导航栏向右滑动 ...

随机推荐

  1. Github配合Jenkins,实现vue等前端项目的自动构建与发布

    本篇文章前端项目以vue为例(其实前端工程化项目的操作方法都相同),部署在Linux系统上(centos). 之前做前端项目的部署,一直都是手动运行打包命令,打包完.再使用FTP.Xshell等这类的 ...

  2. Android中内存泄露与如何有效避免OOM总结

    一.关于OOM与内存泄露的概念 我们在Android开发过程中经常会遇到OOM的错误,这是因为我们在APP中没有考虑dalvik虚拟机内存消耗的问题. 1.什么是OOM OOM:即OutOfMemoe ...

  3. 基于MQTT协议的云端proxy远程登陆

    这篇文件是建立在一下两篇文章基础上完成的 很多重复的内容不会在这章提到 https://www.cnblogs.com/y-c-y/p/11685405.html telnet协议相关 https:/ ...

  4. 最简单的ArcGIS Engine应用程序(下)

    在中篇我们讲到使用OpenFileDialog控件可以添加shp文件.(最简单的ArcGIS Engine应用程序(中)) 添加lyr文件的操作也是大同小异的. using System; using ...

  5. Linux常用高级命令

    目录 linux命令是对Linux系统进行管理的命令.对于Linux系统来说,无论是中央处理器.内存.磁盘驱动器.键盘.鼠标,还是用户等都是文件,Linux系统管理的命令是它正常运行的核心,与之前的D ...

  6. [插件化开发] Poc之后,我选择放弃OSGI

    Poc之后,我选择放弃OSGI TIPS: 如贵司允许重构老系统或者允许使用OSGI的第三方框架改造所带来的投入成本,并且评估之后ROI乐观,那么还是可以使用的. Runtime Version 以下 ...

  7. [LUOGU1437] 敲砖块

    题目描述 在一个凹槽中放置了 n 层砖块.最上面的一层有n 块砖,从上到下每层依次减少一块砖.每块砖 都有一个分值,敲掉这块砖就能得到相应的分值,如下图所示. 14 15 4 3 23 33 33 7 ...

  8. Uipath 浏览器页面最大化和最小化

    文章来源东京IT青年前线http://www.rpatokyo.com/ Uipath 浏览器页面最大化和最小化   浏览器在关闭时会自动记忆上次浏览器关闭时窗口的小,下次再次会以同样的大小打开.机器 ...

  9. GO实现简单(命令行)工具:sftp,文檔压解,RDS备份,RDS备份下载

    GO实现简单(命令行)工具:sftp,文檔压解,RDS备份,RDS备份下载 轉載請註明出處:https://www.cnblogs.com/funnyzpc/p/11721978.html 内容提要: ...

  10. [洛谷P3613]睡觉困难综合症

    写码30min,调码3h的题.. 好在最后查出来了 , , n, x, y, z); 改成了 , , n, mark[x], y, z); 然后$40\rightarrow 100$ #include ...