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

JavaScript 双向链表操作实例分析【创建、增加、查找、删除等】

程序员文章站 2022-09-24 16:17:05
本文实例讲述了javascript 双向链表操作。分享给大家供大家参考,具体如下:一个 双向链表(doubly linked list) 是由一组称为节点的顺序链接记录组成的链接数据结构。每个节点包含...

本文实例讲述了javascript 双向链表操作。分享给大家供大家参考,具体如下:

一个 双向链表(doubly linked list) 是由一组称为节点的顺序链接记录组成的链接数据结构。每个节点包含两个字段,称为链接,它们是对节点序列中上一个节点和下一个节点的引用

开始节点和结束节点的上一个链接和下一个链接分别指向某种终止节点,通常是前哨节点或null,以方便遍历列表。如果只有一个前哨节点,则列表通过前哨节点循环链接。它可以被概念化为两个由相同数据项组成的单链表,但顺序相反。

class dnode {
 constructor(val) {
  this.val = val;
  this.prev = null;
  this.next = null;
 }
}

增加节点

function add(el) {
  var currnode = this.head;
  while (currnode.next != null) {
    currnode = currnode.next;
  }
  var newnode = new dnode(el);
  newnode.next = currnode.next;
  currnode.next = newnode;
}

查找

function find(el) {
  var currnode = this.head;
  while (currnode && currnode.el != el) {
    currnode = currnode.next;
  }
  return currnode;
}

插入

function (newel, oldel) {
  var newnode = new dnode(newel);
  var currnode = this.find(oldel);
  if (currnode) {
    newnode.next = currnode.next;
    newnode.prev = currnode;
    currnode.next = newnode;
  } else {
    throw new error('未找到指定要插入节点位置对应的值!')
  }
}

展示

// 顺序
function () {
  var currnode = this.head.next;
  while (currnode) {
    console.log(currnode.el);
    currnode = currnode.next;
  }
}

// 逆序
function () {
  var currnode = this.head;
  currnode = this.findlast();
  while (currnode.prev != null) {
    console(currnode.el);
    currnode = currnode.prev;
  }
}

删除

function (el) {
  var currnode = this.find(el);
  if (currnode && currnode.next != null) {
    currnode.prev.next = currnode.next;
    currnode.next.prev = currnode.prev;
    currnode.next = null;
    currnode.previous = null;
  } else {
    throw new error('找不到要删除对应的节点');
  }
}

感兴趣的朋友可以使用在线html/css/javascript代码运行工具http://tools.jb51.net/code/htmljsrun测试上述代码运行效果。