用JS实现单链表的基本操作
了解过链表的都知道可以将链表中的每个节点看成是一个对象,这个对象中有两个属性,一个是该节点的值,一个是该节点的下一个节点的地址。
对链表进行插入和删除操作比数组要方便。接下来我们来看一下具体怎么用代码去实现链表的基本操作:
function LinkList(){ //新元素构造 var Node = function (element){ this.element = element; this.next = null; } var length = 0;//链表长度 var head = null;//头结点 /** * 向链表添加新元素 * @param element * @returns {Node|Node} */ this.append = function (element){ var node = new Node(element); var current; if (head === null){ head = node; }else{ current = head; while (current.next){//遍历链表找到最后一个位置 current = current.next; } current.next = node; } length ++; return head; } /** * 删除链表某个位置的结点 * @param option * @returns {null|boolean} */ this.remove = function (option){ var current = head; var previous; var index = 1; if (option > 0 && option <= length){ if (option === 1){ head = current.next; }else{ while (index++ < option){//注意index++ 等于option时还会执行一次循环体。 previous = current; current = current.next; } //循环结束后current就是要删除的结点 previous.next = current.next; } length--; return head }else{ return false; } } /** * 向链表的指定位置插入结点 * @param option * @param element * @returns {null|boolean} */ this.insert = function (option,element){ var node = new Node(element); var current = head; var index = 0; var previous; if (option > -1 && option <= length){ if (option === 0){ node.next = current; head = node; }else{ while (index++ < option){ previous = current; current = current.next; } previous.next = node; node.next = current; } length++; return head; }else{ return false; } } //返回长度 this.getLength = function (){ return length; } //返回链表元素 this.getElement = function (){ var current = head; var string = head.element; while (current.next){ current = current.next; string += ' ' + current.element } return string; } //返回链表 this.getHead = function (){ return head; } } var link = new LinkList(); console.log('================添加结点=====================') link.append(5); link.append(8); link.append(6); link.append(7); console.log("链表长度:" + link.getLength()); console.log("结点元素:" + link.getElement()); console.log(link.getHead()); console.log('================删除第二个结点========================') link.remove(5); console.log("链表长度:" + link.getLength()); console.log("结点元素:" + link.getElement()); console.log(link.getHead()); console.log('=============在第一个位置插入结点结点===================') link.insert(0,66); console.log("链表长度:" + link.getLength()); console.log("结点元素:" + link.getElement()); console.log(link.getHead());
在写这段代码时我在插入结点这一块踩过一个坑,我本来想让插入结点的option和删除节点的option一样,都是表示第几个位置,但是代码写好后发现最后一个位置没有办法插入。
后面我一步一步写下while循环每一个循环结果后发现previous和current两个指针只能到达最后两个结点,所以我们必须要从0开始遍历插入,前移一个位置。