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. k8s pod访问不通外网问题排查

    环境概况 自建k8s集群,主机操作系统ubuntu16.04,k8s版本v1.14, 集群网络方案calico-3.3.6. worker节点数50+,均为GPU物理服务器,服务器类型异构,如Nvid ...

  2. Golang的反射reflect深入理解和示例

    编程语言中反射的概念 在计算机科学领域,反射是指一类应用,它们能够自描述和自控制.也就是说,这类应用通过采用某种机制来实现对自己行为的描述(self-representation)和监测(examin ...

  3. C-02 推荐系统

    目录 推荐系统 一.导入模块 二.收集数据 三.数据预处理 3.1 无评分电影处理 四.协同过滤算法-基于用户的推荐 4.1 余弦相似度 4.2 数据标准化处理 五.预测 六.测试 更新.更全的< ...

  4. C++学习笔记-预备知识

    1.1 C++简介 C++融合3种不同的编程方式:C语言代表的过程性语言.C++在C语言基础上添加的类代表的面向对象语言.C++模板支持的广泛编程. 1.2 C++简史 1.2.1 C语言 Ritch ...

  5. Java类和对象动手动脑

    动手动脑1 以下代码为何无法通过编译?哪儿出错了?

  6. SVN应用

    一:从服务器上down资料 1.在电脑上安装SVN客户端 2.在电脑本地创建个文件夹作为版本库 3.进入xfssvn文件夹右击鼠标选择SVN Checkout或SVN Update 4.输入服务器中配 ...

  7. PHP array_udiff_uassoc

    1.函数的参数:返回数组的差集.用定义的函数比较键值和值. 2.函数的参数: @params array $array @params array $array1 ... @params callab ...

  8. 详细解读 Spring AOP 面向切面编程(一)

    又是一个周末, 今天我要和大家分享的是 AOP(Aspect-Oriented Programming)这个东西,名字与 OOP 仅差一个字母,其实它是对 OOP 编程方式的一种补充,并非是取而代之. ...

  9. Ubuntu16.04搭建boost环境

    下载地址:http://sourceforge.net/projects/boost/files/boost/1.58.0/boost_1_58_0.tar.bz2/download 编译前所需的库 ...

  10. Leetcode(1)两数之和

    Leetcode(1)两数之和 [题目表述]: 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标.你可以假设每种输入只会对应一 ...