链表

// 节点定义
class Node{
    constructor(element){
        this.element = element;
        this.next = null;
    }
}

 

链表实现添加节点的方法有:  add(element)  和  addAt(index,element) , 其中 add 方法是直接将节点添加到链表的最后, addAt 方法是根据索引来添加节点

链表实现删除节点的方法有:  remove(element) 和 removeAt(index) , 其中 remove 方法是根据节点值来删除节点,  removeAt 方法是根据索引来删除节点

链表实现查询节点的方法有:  indexOf(element)  和 elementAt(index), 其中 indexOf 方法是根据节点值来获得节点的索引, elementAt 是根据节点索引来获得节点

下面是链表的实现:

 

// 链表
class LinkedList{

    constructor(){
        this.length=0;
        this.head=null;
    }

    // 返回链表长度
    size(){
        return this.length;
    }

    // 返回链表头节点
    head(){
        return this.head;
    }

    // 往链表最后面加节点
    add(element){
        let node = new Node(element);
        // 1 当链表为空时
        if(this.head===null){
            this.head=node;
        }
        // 2 当链表不为空
        else
        {
            // 下面这句是链表必备代码,获得头节点,从头节点开始遍历
            let currentNode = this.head;  
            // 循环到最后一个节点(currentNode.next为null时,currentNode为最后一个节点)
            while(currentNode.next){        
                currentNode = currentNode.next; 
            }
            // currentNode.next 指向新的节点
            currentNode.next = node;
        }
        // 递增链表长度
        this.length++;
    }
    // 根据节点来删除节点
    remove(element){
        const index = this.indexOf(element);
        return this.removeAt(index);
    }


    // 返回 true 或者 false,代表链表是否为空
    isEmpty(){
        this.length===0;
    }

    // 找到指定节点的下标
    indexOf(element){
        let currentNode = this.head;
        // 这里 index 从 -1 开始,自己动手试试为什么
        let index = -1;
        // 循环所有节点(currentNode为null时,即所有节点都遍历完了,循环终止)
        while(currentNode){
            index++;
            if(currentNode.element===element){
                return index;
            }
            currentNode = currentNode.next;
        }
        return -1;
    }

    // 返回指定索引的节点
    elementAt(index){
        let currentNode = this.head;
        let count=0;
        while(count<index){
            count++;
            currentNode = currentNode.next;
        }
        return currentNode;
    }

    // 在指定的位置加入节点
    addAt(index,element){
        let node = new Node(element);
        let currentNode = this.head;
        let previousNode;
        let currentIndex=0;

        // 超出链表范围返回 false,注意这里不能加等于 因为最后一个位置可以加元素
        if(index>this.length || index<0){
            return false;
        }

        // 1 如果是在最前面加入节点
        if(index===0){
            node.next = currentNode;
            this.head = node;
        }
        // 2 如果在中间或最后加入节点
        else{
            // 循环条件在currentIndex等于index时终止
            while(currentIndex<index){
                currentIndex++;
                previousNode=currentNode;
                currentNode = currentNode.next;
            }
            node.next= currentNode;
            previousNode.next = node;
        }
        this.length++;
    }


    // 在指定索引下删除节点
    // 和上面的 addAt 方法差不多,只是在while循环后的操作不一样,即插入节点和删除节点的所需的操作不一样
    removeAt(index){
        let currentNode = this.head;
        let previousNode;
        let currentIndex=0;

        // 注意这里要加等于号,因为等于的时候,index下标指向的节点为null
        if(index>=this.length || index<0){
            return false;
        }

        // 1 要删除的为头节点
        if(index===0){
            this.head = currentNode.next;
        }
        // 2 要删除的不是头节点
        else{
            while(currentIndex<index){
                currentIndex++;
                previousNode=currentNode;
                currentNode=currentNode.next;
            }
            previousNode.next = currentNode.next;
        }
        this.length--;
        return currentNode.element;
    }
}

 

上一篇:ji qi xue xi fen lei


下一篇:234.回文链表