用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开始遍历插入,前移一个位置。

 

posted @ 2021-10-30 10:03  打遍天下吴敌手  阅读(792)  评论(0编辑  收藏  举报