原生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实现全屏切换以及导航栏滑动隐藏及显示——重构前
思路分析: 向后滚动鼠标滚轮,页面向下全屏切换:向前滚动滚轮,页面向上全屏切换.切换过程为动画效果. 第一屏时,导航栏固定在页面顶部,切换到第二屏时,导航条向左滑动隐藏.切换回第一屏时,导航栏向右滑动 ...
随机推荐
- LitePal的基本用法
快速配置 1. 引入Jar包或源码 首先我们需要将LitePal的jar包引入到项目当中,可以点击这里查看LitePal的最新版本,选择你需要的下载即可.下载好了jar包之后,把它复制到项目的li ...
- Spring Boot (十三): Spring Boot 整合 RabbitMQ
1. 前言 RabbitMQ 是一个消息队列,说到消息队列,大家可能多多少少有听过,它主要的功能是用来实现应用服务的异步与解耦,同时也能起到削峰填谷.消息分发的作用. 消息队列在比较主要的一个作用是用 ...
- 将jar包发布到maven的中央仓库细节整理
在学习springboot框架的时候,会引入各种各样的starter依赖,照着教程尝试写了个demo-spring-boot-stater,可以理解为一个组件,随引随用 但是只能自己引用,无法共享,于 ...
- SpringBootSecurity学习(24)前后端分离版之OAuth2.0 应用登记
应用登记 一个应用要求 OAuth 授权,必须先到对方网站登记,让对方知道是谁在请求.举个例子,下面是github的登记页面: https://github.com/settings/applicat ...
- TensorFlow2.0(7):激活函数
.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ...
- sql数据文件导入数据库
1.首先通过xshell连接数据库服务器,执行命令mysql -u root -p 命令,按照提示输入密码.连接上数据库. 2.在连接终端上执行命令create database JD_Model; ...
- Qt5教程: (6) 菜单栏、工具栏、状态栏及核心控件
1. 新建QMainWindow工程 取消生成.ui文件 2. 菜单栏 在mainwindow.cpp中添加头文件 和 #include <QMenuBar> #include <Q ...
- Oracle报错注入总结
0x00 前言 在oracle注入时候出现了数据库报错信息,可以优先选择报错注入,使用报错的方式将查询数据的结果带出到错误页面中. 使用报错注入需要使用类似 1=[报错语句],1>[报错语句], ...
- CSP-S 初赛内容整理
图灵奖 艾伦·麦席森·图灵(Alan Mathison Turing,1912-1954)1966 共计70名科学家获此殊荣,华人仅有1位,他是2000年姚期智. 解释型语言 Python / Jav ...
- POJ 1258 Agri-Net(Prim)
题目网址:http://poj.org/problem?id=1258 题目: Agri-Net Time Limit: 1000MS Memory Limit: 10000K Total Sub ...