原生JS实现单向链表

Posted 难凉热血,码梦为生!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原生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();

(完)

以上是关于原生JS实现单向链表的主要内容,如果未能解决你的问题,请参考以下文章

用JS实现单向链表

C语言反转单向链表的代码

原生js实现数据单向绑定

链表的java实现(单向双向链表,单向链表的反转)

链表的java实现(单向双向链表,单向链表的反转)

单向链表 代码实现