使用js对链表数据结构的实现

来源:互联网 发布:猎人同人知之四时蝶 编辑:程序博客网 时间:2024/06/16 19:06

使用JS对链表数据结构的实现

  • 看数据结构的书大多对各种数据结构算法的实现都是使用c,所以自己用JS写了一个,也可以加深对数据结构的理解
class Node {  constructor(data) {    this.data = data;    this.next = null;  }}class List {  constructor() {    this.head = new Node('head');  };  //往头部插入  prevInsert(data) {    var newNode = new Node(data);    newNode.next = this.head.next;    this.head.next = newNode;  };  //查询链表,显示链表中对index个元素,如果不传则会展示整个链表  show(index) {    if (index) {      var currNode = this.head;      for (let i = 0; i < index; i++) {        var nextNode = currNode.next;        currNode = nextNode;      }      console.log(currNode)    } else {      var currNode = this.head;      var nextNode;      while (currNode.next) {        nextNode = currNode.next;        currNode = nextNode;        console.log(currNode)      }    }  };  //往尾部插入  nextInsert(data) {    var currNode = this.head;    var nextNode;    while (currNode.next) {      nextNode = currNode.next;      currNode = nextNode;    }    if (!currNode.next) {      currNode.next = new Node(data)    }  };  //查询函数,如果传入数字就查找索引,传入内容就查找内容  find(index) {    var currNode = this.head;    var nextNode;    var flag = 1;    if (typeof(index) === 'number' && index > 0) {      //如果是数字的话      while (1) {        nextNode = currNode.next;        currNode = nextNode;        if (flag == index) {          console.log(currNode);          return;        }        if (!currNode.next) {          console.log('索引大于链表长度');          return;        }        flag++;      }    } else {      //传入参数不是数字,则解析为内容      while (1) {        nextNode = currNode.next;        currNode = nextNode;        if (currNode.data == index) {          console.log(currNode);          return;        }        if (!currNode.next) {          console.log('查找内容不在链表中');          return;        }      }    }  };  //插入到指定位置  indexInsert(index, data) {    var currNode = this.head;    var nextNode;    var flag = 0;    while (1) {      nextNode = currNode.next;      currNode = nextNode;      if (flag == index - 1) {        var newNode = new Node(data);        newNode.next = currNode.next        currNode.next = newNode;        return;      }      flag++    }  };  //删除指定位置,或删除指定内容  delete(index) {    var prevNode;    var currNode = this.head;    var nextNode;    var flag = 1;    if (typeof(index) === 'number') {      while (1) {        prevNode = currNode;        nextNode = currNode.next;        currNode = nextNode;        if (flag === index) {          prevNode.next = currNode.next          return;        }        if (!currNode.next) {          console.log('索引超出链表长度');          return;        }        flag++      }    } else {      while (1) {        prevNode = currNode;        nextNode = currNode.next;        currNode = nextNode;        if (currNode.data === index) {          prevNode.next = currNode.next          return;        }        if (!currNode.next) {          console.log('链表没有此元素');          return;        }      }    }  };}var list = new List();list.nextInsert('fir');list.nextInsert('sec');list.nextInsert('thr');list.nextInsert('four');list.delete('thr')list.show()