一、实现功能

  1、链表元素头部插入 this.unShift = function(data) {}

  2、链表元素尾部插入 this.append= function(data) {} //返回boolean

  3、链表元素按位置插入 this.insert= function(position, data) {} //返回boolean

  4、链表元素头部删除 this.shift= function() {} //返回boolean

  5、链表元素尾部删除 this.pop = function() {} //返回boolean

  6、链表按元素删除 this.removeData = function(data) {} //返回boolean

  7、链表按下标删除 this.removePos = function(position) {} //返回boolean

  8、链表是否为空 this.isEmpty= function() {} //返回boolean

  9、链表元素组成的字符串 this.toString= function() {} //返回 string

  10、链表的长度 this.length= function() {} //返回number

  11、链表查找元素 this.searchData= function(data) {}  //返回obj={index:,data:}

二、节点声明

function Node(data) {
this.data = data //数据
this.next = null //指向
}

三、完整功能代码

function List() {
let length = 0
let head = null
this.append = (data) => { // 向链表末尾添加元素
let node = new Node(data)
let current
if(head === null) {
head = node
}
else {
current = head
while(current.next) {
current = current.next
}
current.next = node
}
length ++
return true
}
this.insert = (position, data) => { // 向链表指定位置添加元素
if (position >= 0 && position <= length) { //检查是否越界
let node = new Node(data),
current = head,
previous,
index = 0
if (position === 0) { //在第一个位置添加
node.next = current
head = node
}else {
while (index ++ < position) {
previous = current
current = current.next
}
//通过改变指针,将node链接在previous和current之间
node.next = current
previous.next = node
}
length ++
return true
}else {
return false
}
}
this.removeData = (data) => { // 通过数据删除链表元素
let previous,
current,
index = 0
if (head === null) {
return false
}
current = head
while(index ++ < length && current.data !== data) {
previous = current
current = current.next
}
if(index > length) {
return false
}else {
current.next = current.next
length --
return true
}
}
this.removePos = (position) => { // 通过位置删除链表元素
if( position >= -1 && position < length) {
let previous,
current = head,
index = 0
if (position === 0) {
head = current.next
}else {
while(index ++ < position) {
previous = current
current = current.next
}
previous.next = current.next
}
length --
return true
}else {
return false
}
}
this.unShift = (data) => { //向链表首插入元素
let node = new Node(data),
current = head
node.next = current
head = node
length ++
return true
}
this.shift = () => { //删除链表首元素
let current = head
if(head === null) {
return false
}
else {
head = current.next
length --
return true
}
}
this.pop = () => { // 删除链表尾元素
let current,
previous
if (head === null){
return false
}
current = head
while(current) {
previous = current
current = current.next
}
previous = null
length --
return true
}
this.isEmpty = () => {
return length === 0
}
this.length = () => {
return length
}
this.searchData = (data) => { //查找元素
let current,
index = 0,
obj = {}
if( head === null ) {
return false
}
current = head
while(index ++ < length && current.data !== data) {
current = current.next
}
obj = {
index: index,
data: current.data
}
return obj
}
this.toString = () => { //输出数据组成的字符串
let resultStr = "",
current,
index = length
if (head === null) {
return ""
}
current = head
while(index -- > 0) {
resultStr += "," + current.data
current = current.next
}
return resultStr.slice(1)
}
}

四、测试代码及结果

  1、测试代码

<!DOCTYPE html>
<html>
<head>
<title>test</title>
<script type="text/javascript" src="./singleList.js"></script>
</head>
<body>
<script type="text/javascript">
let singleList = new List()
console.log(singleList.append("1"))
console.log(singleList.toString())
console.log(singleList.append("2"))
console.log(singleList.toString())
console.log(singleList.append("3"))
console.log(singleList.toString())
console.log(singleList.unShift(0))
console.log(singleList.toString())
console.log(singleList.insert(2,"4"))
console.log(singleList.toString())
console.log(singleList.shift())
console.log(singleList.toString())
console.log(singleList.pop())
console.log(singleList.toString())
console.log(singleList.searchData("1"))
console.log(singleList.removePos(1))
console.log(singleList.toString())
console.log(singleList.removeData("1"))
console.log(singleList.toString())
console.log(singleList.isEmpty())
</script>
</body>
</html>

  2、测试结果

使用JavaScript实现单向链表的更多相关文章

  1. JavaScript实现单向链表

    JavaScript 本身提供了十分好用的数据类型,以满足大家的日常使用.单靠 Array  和 Object 也的确足够应付日常的绝大部分需求,这也导致了很多前端er对数据结构这一块不是十分的了解. ...

  2. JavaScript实现单向链表结构

    参考资料 一.什么是链表结构? 1.1.简介 链表和数组一样, 可以用于存储一系列的元素, 但是链表和数组的实现机制完全不同,链表中的元素在内存不是连续的空间,链表的每个元素由一个存储元素本身(数据) ...

  3. 学习javascript数据结构(二)——链表

    前言 人生总是直向前行走,从不留下什么. 原文地址:学习javascript数据结构(二)--链表 博主博客地址:Damonare的个人博客 正文 链表简介 上一篇博客-学习javascript数据结 ...

  4. Reverse Linked List II 单向链表逆序(部分逆序)

    0 问题描述 原题点击这里. 将单向链表第m个位置到第n个位置倒序连接.例如, 原链表:1->2->3->4->5, m=2, n =4 新链表:1->4->3-& ...

  5. 【编程题目】输入一个单向链表,输出该链表中倒数第 k 个结点

    第 13 题(链表):题目:输入一个单向链表,输出该链表中倒数第 k 个结点.链表的倒数第 0 个结点为链表的尾指针.链表结点定义如下: struct ListNode {int m_nKey;Lis ...

  6. 输出单向链表中倒数第k个结点

    描述 输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针. 链表结点定义如下: struct ListNode { int       m_nKey; ListNode* ...

  7. Linus:利用二级指针删除单向链表

    Linus大神在slashdot上回答一些编程爱好者的提问,其中一个人问他什么样的代码是他所喜好的,大婶表述了自己一些观点之后,举了一个指针的例子,解释了什么才是core low-level codi ...

  8. 【转】Linus:利用二级指针删除单向链表

    原文作者:陈皓 原文链接:http://coolshell.cn/articles/8990.html 感谢网友full_of_bull投递此文(注:此文最初发表在这个这里,我对原文后半段修改了许多, ...

  9. C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)

    #include<stdio.h> #include<malloc.h> #define LEN sizeof(struct Student) struct Student / ...

随机推荐

  1. python基础篇_006_面向对象

    面向对象 1.初识类: # 定义一个函数,我们使用关键字 def """ def 函数名(参数): '''函数说明''' 函数体 return 返回值 "&qu ...

  2. Gym 100963B

    Gym 100963B啊,郁闷,就tm调小了一点范围就A了,就写dp和贪心比较一下,范围到最大值的二倍-1就好了假设最大值的2倍以内能满足最优条件,当金额范围超过最大值2倍的时候:至于为什么,还不清楚 ...

  3. 深入理解Java虚拟机阅读心得(二)

    垃圾收集 程序计数器.虚拟机栈.本地方法栈三个区域随线程而生,随线程而灭:这几个区域的内存分配和回收都具备稳定性,不需要过多的考虑回收的问题.而Java堆和方法区则不一样. Java堆中存储了几乎所有 ...

  4. ISP PIPLINE (七) gamma

    what is the gamma? CCD.CMOS成像方式是通过像点中的"硅"感受光线的强弱而获得画面.而硅感光是物理成像,它真实地反应光线强度的变化,来多少就输出多少,因此它 ...

  5. 13树莓派手动安装Home Assistant

    2017-09-05 00:53:02 https://home-assistant.io/docs/installation/raspberry-pi/ 已经安装步骤安装了带桌面的树莓派系统,在SD ...

  6. 8. 环境变量_数据库_mongoose的基本使用_模型对象的CRUD

    1. 环境变量 系统环境(cmd)使用的变量/命令 能够让我们在cmd环境下运行指定的程序 用户环境变量 path(我们一般设置这个) 系统环境变量 path 过程: 当我们在cmd中输入一个指令 先 ...

  7. js 设计模式之观察者模式

    观察者模式 又被称为“发布-订阅”模式,目的是解决主题对象和观察者之间功能的耦合性.发布者和订阅者之间是互不干扰的,没有联系的,通过观察者,当做中介,将二者联系起来. 例子:以学生和老师之间的为例 1 ...

  8. thinkphp框架,数据动态缓存后,或数据已读取出来,想分页怎么办

    //读取缓存后赋值到数组,通过array_slice函数处理,如: $blog = S('blogname'); //赋值 $count = count($blog); //条数统计 $page = ...

  9. org.apache.ibatis.binding.BindingException: Parameter 'start' not found. Available parameters are [1, 0, param1, param2]

    DEBUG 2018-05-30 08:43:26,091 org.springframework.jdbc.datasource.DataSourceTransactionManager: Roll ...

  10. Java语言基础之数组

    引出数组和数组的定义 为什么要使用数组: 问题一: 声明变量时,每一个单独的变量都要对应一个变量名,但现在要处理一组相同类型的数据时,如要表示班上100个人的年纪,绝不能定义100个变量来表示每一个人 ...