原生JS实现单向链表

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 创建链表类

 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();

(完)

原文地址:https://www.cnblogs.com/wangjiachen666/p/9462895.html

时间: 2024-10-21 08:45:20

原生JS实现单向链表的相关文章

js实现单向链表

add() 添加元素 clear() 清空链表 contains(data) 是否包含元素 display() 显示链表 get(position) 得到索引位置的元素 isEmpty() 链表是否为空 remove(position) 移除索引位置的元素 reverse() 倒置链表 set(position, data) 向链表指定位置设置修改元素 size() 返回链表的长度 var Node = function (data) { this.data = data; this.next

原生js实现数据双向绑定

最近接触了vue,在谈到vue等等的mvvm框架之前,先了解什么是数据双向绑定以及如何利用原生JS实现数据双向绑定 单向数据绑定 指先把模板写好,然后把模板和数据(数据可能来自后台)整合到一起形成HTML代码,然后把这段HTML代码插入到文档流里 缺点:一旦HTML代码生成就没有办法改变,如果有新数据重新传入,就必须重新把模板和数据整合到一起插入到文档流中 数据双向绑定 数据模型和视图之间的双向绑定,用户在视图上的修改会自动同步到数据模型中,同样的,如果数据模型中的值发生变化,也会同步到视图中去

原生 js前端路由系统实现2之代码可读性 和可扩展性

前一篇 尝试着实现了前端路由的部分功能 原生 js前端路由系统实现1 代码可读性 影响代码可读和易于理解的因素 1 代码规范 2缩进空格 3减少函数嵌套层次 4函数单一职责 5.... 以上这些顶多只能在外观上面看起来清晰(也不一定真的清晰),但随着代码量的增大  代码依然非常难读和易于理解 如果给你几十行代码,程序员通过琢磨也能短时间搞清楚,如果给你上万行代码 即便技术大牛也得花大量的时间去阅读和调试才能看懂 影响代码可读性的主要原因是 代码的多少 以下是上次实现路由的代码 去掉兼容AMD等库

利用原生JS实现网页1920banner图滚动效果

内容描述:随着PC设备硬件性能的进步和分辨率的不断提高,现在主流网站逐渐开始采用1920banner图,为适应这一趋势,博主设计了1920banner图的滚动效果,代码利用了原生JS实现了1920banner图的切换效果,并针对低分辨率电脑设备进行了适配,实现了JS代码与HTML代码的完全分离,符合w3c的标准使用规范,希望能给各位开发者朋友以帮助和参考.如发现有缺陷和不足,欢迎大家予以指正,如有更好的意见或解决方法,可在评论区交流互动.一下为代码内容: <!DOCTYPE html> <

原生JS写的ajax函数

参照JQuery中的ajax功能,用原生JS写了一个ajax,功能相对JQuery要少很多,不过基本功能都有,包括JSONP. 调用的方式分为两种: 1. ajax(url, {}); 2. ajax({}); 调用的方法参照JQuery的ajax,只是 不需要写$.ajax ,只需要写 ajax 就可以了. 代码如下: !function () { var jsonp_idx = 1; return ajax = function (url, options) { if (typeof url

原生js自动触发事件

熟悉jquery的童鞋都知道在jq中有一个方法可以自动触发事件,那就是trigger(),那么通过原生js又怎么模拟触发呢? js中添加一个主动触发事件的方法有dispatch.该方法能模拟用户行为,如点击(click)操作等. 标准使用dispatchEvent方法,IE6/7/8则使用fireEvent方法. dispatchEvent() 方法给节点分派一个合成事件. 语法如下: dispatchEvent(eventObj) eventObj 参数是一个描述事件的 ActionScrip

数据结构与算法学习-单向链表的实现

链表(Chain本文所说链表均为单向链表,以下均简称单向链表)实际上是由节点(Node)组成的,一个链表拥有不定数量的节点.而向外暴露的只有一个头节点(Head),我们对链表的所有操作,都是直接或者间接地通过其头节点来进行的. 节点(Node)是由一个需要储存的对象及对下一个节点的引用组成的.也就是说,节点拥有两个成员:储存的对象.对下一个节点的引用. 这样说可能大家不是很明白,我贴一张图大家可能更容易理解. package LinkedList; /** * <p><strong>

算法总结之 反转部分单向链表

给定单链表的表头节点head, 以及两个整数from 和 to, 在单向链表上把fro个节点到第to个节点这一部分进行反转 思路: 本题 有可能存在换头的问题,所以函数应该返回调整后的新的头节点 1 判断是否满足 1<=from<=to<=N 如果不满足,直接返回原来的头节点 2 找到第from-1个节点pre和第to+1个节点tPos,fPre即要反转部分的前一个节点,tPos是反转部分的后一个节点,把反转部分先反转,然后正确的链接fPre和tPos package TT; impor

C语言之字符单向链表

/* * @Author: suifengtec * @Date:   2017-09-02 16:06:33 * @Last Modified by:   suifengtec * @Last Modified time: 2017-09-02 20:47:13 **/ /* 字符单向链表 gcc -o a.exe main.c && a  */ #include <stdio.h> #include <stdlib.h> #include <stdbool