【javascript】数据结构-链表
// 创建一个链表 function LinkedList(){ // 创建一个Node辅助类,表示需要加入列表的项,它包含一个element属性,即表示需要加入到列表中的值,next属性表示指向下一个节点项目的指针 let Node = function(element){ this.element = element; this.next = null; }; // 长度初始化为0,列表头部初始化为空 let length = 0; let head = null; // append方法,向链表尾部追加元素 this.append = function(element){ let node = new Node(element), current; // 列表中的第一个节点 if(head == null){ head = node; } else{ current = head; // 循环列表,直到找到最后一项 while(current.next){ current = current.next; } // 找到最后一项,将next值赋给node,建立链接 current.next = node; } // 更新列表长度 length++; }; // insert方法,向列表的特定位置插入一个新的项 this.insert = function(position, element){ // 检查越界值 if(position >=0 && position <=length){ // current是对插入元素之后的元素的引用,previous是对插入元素之前的元素的引用 let node = new Node(element), current = head, previous, index = 0; // 在第一项位置添加 if(position === 0){ node.next = current; head = node; } else{ while(index++ < position){ previous = current; current = current.next; } node.next = current; previous.next =node; } // 更新列表长度 length++; return true; } else{ return false; } }; // removeAt方法:从链表特定位置移除一项 this.removeAt = function(position){ // 检查越界值 if(position > -1 && position < length){ let current = head, previous, index = 0; // 移除第一项 if(position === 0){ head = current.next; } else{ while(index++ < position){ previous = current; current = current.next; } // 将previous与current的下一项链接起来,跳过current从而移除它 previous.next = current.next; } // 更新列表长度 length--; return current.element; } else{ return null; } }; // remove方法:从列表中移除一项 this.remove = function(element){ let index = this.indexOf(element); // 调用removeAt()方法 return this.removeAt(index); }; // indexOf方法:返回元素在列表中的索引,如果没有该元素则返回-1; this.indexOf = function(element){ let current = head, index = 0; while(current){ if(element === current.element){ return index; } index++; current = current.next; } return -1; }; // isEmpty方法,如果链表中不包含任何元素,则返回true,否则返回false this.isEmpty = function(){ return length === 0; }; // size方法,返回链表中包含的元素个数,与数组的length属性类似 this.size = function(){ return length; }; // getHead方法:返回链表第一个元素 this.getHead = function(){ return head; }; // toSting方法,由于链表使用了Node类,重写了javascript的toString方法,让其只输出元素的值 this.toString = function(){ let current = head, string = ''; while(current){ string += current.element + (current.next ? ',':''); current = current.next; } return string; }; // print方法,用于在控制台输出链表元素 this.print = function(){ console.log(this.toString()); }; } // 链表的使用 var lnkst = new LinkedList(); // 打印链表长度 console.log(lnkst.size()); // 给链表添加元素 lnkst.append(1); lnkst.append(2); lnkst.append(3); lnkst.append(4); lnkst.append(5); // 调用打印方法 lnkst.print(); //输出1,2,3,4,5 // 插入元素 lnkst.insert(2,'a'); lnkst.print(); //输出1,2,a,3,4,5 // 按位置删除元素 lnkst.removeAt(2); lnkst.print(); //输出1,2,3,4,5 // 按值删除元素 lnkst.remove(5); lnkst.print(); //输出1,2,3,4 //判断是否为空 console.log(lnkst.isEmpty()); //false // 获取头部; console.log(lnkst.getHead()); //1