回到顶部 Fork me on GitHub

原生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 current = this.find(value);
  if (!current) {
    return console.log('链表中找不到被删除的元素');
  }
  var previous = this.findPrevious(value);

  if (!previous) {
    this.head = current.next;
  } else {
    previous.next = current.next;
  }
  this.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;
  }
  if (current.value === value) {
    console.log('当前查找的节点为链表的头节点,头节点前再无节点');
    return null;
  }
  while (current.next) {
    if (current.next.value === value) {
      return current;
    }
    current = current.next;
  }
  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();

5.完整代码

完整代码请戳☞☞☞LinkedList.js

(完)

posted on 2018-08-12 14:08  难凉热血,码梦为生!  阅读(3369)  评论(0编辑  收藏  举报

导航