欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JS双向链表实现与使用方法示例(增加一个previous属性实现)

程序员文章站 2023-12-09 21:17:09
本文实例讲述了js双向链表实现与使用方法。分享给大家供大家参考,具体如下: 前面一篇讲述了《js基于对象的链表实现与使用方法》,这里的双向链表通过增加一个previous...

本文实例讲述了js双向链表实现与使用方法。分享给大家供大家参考,具体如下:

前面一篇讲述了《js基于对象的链表实现与使用方法》,这里的双向链表通过增加一个previous属性实现。

单链表中若需要查找某一个元素时,必须从第一个元素开始进行查找,而双向链表除开头节点和最后一个节点外每个节点中储存有两个指针,这连个指针分别指向前一个节点的地址和后一个节点的地址,这样无论通过那个节点都能够寻找到其他的节点。

原理如下图所示:

JS双向链表实现与使用方法示例(增加一个previous属性实现)

示例代码:

/*双向链表
* */
function node(element) {
  this.element = element;
  this.next = null;
  this.previous = null;//双向链表在这里需要增加一个previous属性
}
function llist() {
  this.head = new node("head");
  this.find = find;
  this.insert = insert;
  this.display = display;
  this.remove = remove;
  this.findlast = findlast;
  this.dispreverse = dispreverse;//将链表反转
}
function dispreverse() {
  var currnode = this.head;
  currnode = this.findlast();
  var nodestr = "";
  while (!(currnode.previous == null)) {
    nodestr += " "+currnode.element;
    currnode = currnode.previous;
  }
  console.log("将链表反转后: "+nodestr);
}
function findlast() {
  var currnode = this.head;
  while (!(currnode.next == null)) {
    currnode = currnode.next;
  }
  return currnode;
}
function remove(item) {
  var currnode = this.find(item);
  if (!(currnode.next == null)) {
    currnode.previous.next = currnode.next;
    currnode.next.previous = currnode.previous;
    currnode.next = null;
    currnode.previous = null;
  }
}
// findprevious is no longer needed
/*function findprevious(item) {
 var currnode = this.head;
 while (!(currnode.next == null) &&
 (currnode.next.element != item)) {
 currnode = currnode.next;
 }
 return currnode;
 }*/
function display() {
  var currnode = this.head;
  var nodestr = "";
  while (!(currnode.next == null)) {
    nodestr += " "+currnode.next.element;
    currnode = currnode.next;
  }
  console.log(nodestr);
}
function find(item) {
  var currnode = this.head;
  while (currnode.element != item) {
    currnode = currnode.next;
  }
  return currnode;
}
function insert(newelement, item) {
  var newnode = new node(newelement);
  var current = this.find(item);
  newnode.next = current.next;
  newnode.previous = current;//双向链表在这里需要设置新节点previous属性
  current.next = newnode;
}
var cities = new llist();
cities.insert("conway", "head");
cities.insert("russellville", "conway");
cities.insert("carlisle", "russellville");
cities.insert("alma", "carlisle");
cities.display();//conway russellville carlisle alma
cities.remove("carlisle");
cities.display();//conway russellville alma
cities.dispreverse();// alma russellville conway

这里使用在线html/css/javascript代码运行工具http://tools.jb51.net/code/htmljsrun测试上述代码,可得如下运行结果:

JS双向链表实现与使用方法示例(增加一个previous属性实现)

更多关于javascript相关内容感兴趣的读者可查看本站专题:《javascript数据结构与算法技巧总结》、《javascript数学运算用法总结》、《javascript排序算法总结》、《javascript遍历算法与技巧总结》、《javascript查找算法技巧总结》及《javascript错误与调试技巧总结

希望本文所述对大家javascript程序设计有所帮助。