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 创建链表类
1 //创建一个Node辅助类,用来生成节点 2 function Node(value) { 3 ????this.value = value; 4 ????this.next = null; 5 ??} 6 ???7 //链表类 8 function LinkedList() { 9 ????this.head = null;10 ????this.length = 0;11 ????//向链表尾部追加元素12 ????this.push = push;13 ????//从链表中查找某个元素14 ????this.find = find;15 ????//在链表中任意一个元素之后插入一个元素16 ????this.insertAfter = insertAfter;17 ????//从链表中查找任意元素节点的前一个节点18 ????this.findPrevious = findPrevious;19 ????//从链表中删除值为value的元素20 ????this.remove = remove;21 ????//返回当前链表的长度22 ????this.size = size;23 ????//查找某个元素在链表中的索引值24 ????this.indexof = indexof;25 ????//删除链表中第pos个元素26 ????this.removeAt = removeAt;27 ????//获取链表中第一个元素28 ????this.getHead = getHead;29 ????//打印当前的链表,供测试用30 ????this.print = print;31 ??}
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 previous = this.findPrevious(value); ???var current = this.find(value); ???if (previous == null) { ?????return console.log(‘链表中找不到被删除的元素‘); ???} ???previous.next = current.next; ???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; ???} ???while (current.next) { ?????current = current.next; ?????if (current.next.value === value) { ???????return current; ?????} ???} ???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();
(完)
原生JS实现单向链表
原文地址:https://www.cnblogs.com/wangjiachen666/p/9462895.html