原生JS实现单向链表
1.前言
用JS实现一个简单的单向链表,并完成相关的功能
2.功能说明
- push(value):从链表尾部添加一个新的节点
- insertAfer(value,item):向链表中的item节点之后插入一个 值为value的新节点
- remove(value):删除链表中值为value的节点
- removeAt(pos):删除链表中第pos个节点
- find(value):查找链表中值为value的节点
- findPrevious(value):查找链表中值为value的节点的前一个节点
- indexof(vallue):查找链表中值为value的节点的索引值,如果查找不到则返回-1
- size():获取当前链表的长度
- getHead():获取当前链表的头节点
- 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的节点
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的节点的前一个节点
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实现单向链表的更多相关文章
- JS实现单向链表、双向链表、循环链表
https://cloud.tencent.com/developer/article/1114246 链表存储有序的元素的集合,但是和数组不同的是,链表中的元素在内存中的存储并不是连续的.每一个链表 ...
- JS数据结构与算法--单向链表
链表结构:链表中每个元素由一个存储元素本身的节点和一个指向下一元素的引用组成.如下所示(手画的,比较丑,懒得用工具画了,嘻嘻) 1.append方法,向链表末尾插入一个节点 2.insert(posi ...
- 原生js实现数据双向绑定
最近接触了vue,在谈到vue等等的mvvm框架之前,先了解什么是数据双向绑定以及如何利用原生JS实现数据双向绑定 单向数据绑定 指先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HT ...
- 原生JS封装Ajax插件(同域&&jsonp跨域)
抛出一个问题,其实所谓的熟悉原生JS,怎样的程度才是熟悉呢? 最近都在做原生JS熟悉的练习... 用原生Js封装了一个Ajax插件,引入一般的项目,传传数据,感觉还是可行的...简单说说思路,如有不正 ...
- 常用原生JS方法总结(兼容性写法)
经常会用到原生JS来写前端...但是原生JS的一些方法在适应各个浏览器的时候写法有的也不怎么一样的... 今天下班有点累... 就来总结一下简单的东西吧…… 备注:一下的方法都是包裹在一个EventU ...
- 原生JS实现"旋转木马"效果的图片轮播插件
一.写在最前面 最近都忙一些杂七杂八的事情,复习软考.研读经典...好像都好久没写过博客了... 我自己写过三个图片轮播,一个是简单的原生JS实现的,没有什么动画效果的,一个是结合JQuery实现的, ...
- 再谈React.js实现原生js拖拽效果
前几天写的那个拖拽,自己留下的疑问...这次在热心博友的提示下又修正了一些小小的bug,也加了拖拽的边缘检测部分...就再聊聊拖拽吧 一.不要直接操作dom元素 react中使用了虚拟dom的概念,目 ...
- React.js实现原生js拖拽效果及思考
一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖 ...
- 原生JS实现全屏切换以及导航栏滑动隐藏及显示——重构前
思路分析: 向后滚动鼠标滚轮,页面向下全屏切换:向前滚动滚轮,页面向上全屏切换.切换过程为动画效果. 第一屏时,导航栏固定在页面顶部,切换到第二屏时,导航条向左滑动隐藏.切换回第一屏时,导航栏向右滑动 ...
随机推荐
- Cannot access a disposed object in ASP.NET Core
Cannot access a disposed object in ASP.NET Core 楠木大叔 导航 常见原因 总结 对于.neter来说,在使用ASP.NET Core的过程中 ...
- docker镜像命令使用
创建docker容器时使用的docker镜像如果在本地中不存在,docker就会自动从docker镜像仓库中下载,默认的docker镜像仓库是Docker Hub公共镜像源 使用docker sear ...
- node与mysql的相互使用————node+mysql
node与mysql的相互使用----node+mysql 为什么选node???因为我是个前端. 为什么选mysql???因为成熟,稳定,听说容易学. 一.mysql数据库: mysql下载和使用我 ...
- 搭建YUM本地仓库
本文介绍如何利用CentOS 7 ISO光盘镜像搭建YUM本地仓库. 环境准备: (1)VMware15.5版本虚拟机 (2)CentOS-7-x86_64-DVD-1908光盘镜像文件 1. 搭建Y ...
- [Quarks PwDump]Hash dump神器
好不好用就不用说了哈 记录下使用方式 也支持导出本地哈希.域控哈希等.配合hashcat神器 奇效. 它目前可以导出 : – Local accounts NT/LM hashes +history ...
- luogu P3936 Coloring
[返回模拟退火略解] 题目描述 在一个 n×mn\times mn×m 的矩阵中,每个点都染了一种颜色(只能是 [1,c][1,c][1,c] 中的一种),求一种方案,使得相邻异色点对数最小. Sol ...
- SpringBoot系列:Spring Boot集成Spring Cache,使用RedisCache
前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache.RedisCache.ConcurrentMapCac ...
- std::wstring
std::wstring主要用于 UTF-16编码的字符, std::string主要用于存储单字节的字符( ASCII字符集 ),但是也可以用来保存UTF-8编码的字符. UTF-8和UTF-16是 ...
- opencv实践::对象计数
问题描述 真实案例,农业领域经常需要计算对象个数 或者在其它领域拍照自动计数,可以提供效率,减低成本 解决思路 通过二值分割+形态学处理+距离变换+连通区域计算 #include <opencv ...
- MS09-020 iis6.0提权
漏洞编号:MS09-020 披露日期: 2009/6/9 受影响的操作系统:Windows 2003 x64 sp1 sp2;XP; 测试系统:windows 2003 x64 上传 执行 iis ...