• 使用javaScript来实现一个单链表


    1.创建链表节点

    class Node{
        constructor(element,next){
            this.element = element;
            this.next = next;
        }
    }

    2.创建一个比较函数

    function defaultEquals(a , b){
        return a == b;
    }

    3.创建一个单链表的类

    class LinkedList {
            constructor(equalsFn = defaultEquals){
                this.head = undefined;
                this.count = 0;
                this.equalsFn = equalsFn;
            }
    }

    4.获取链表的长度

     size(){
                return this.count;
            }

    5.判断链表是否为空

            isEmpty(){
                return this.size() == 0;
            }

    6.添加元素

            push(element){
                let node = new Node(element);
                if(this.head == undefined){//如果链表只有一个节点
                    this.head = node;
                }else{
                    let current = this.head;
                    while(current.next!=null){//一直遍历到链表尾部
                        current = current.next;
                    }
                    current.next = node;
                }
                this.count++;
            }

    7.获取指定位置的值

            getElementAt(index){
                if(index>=0 && index< this.count){
                    let current = this.head;
                    for(let i = 0; i < index && current != null; i++){
                        current = current.next;
                    }
                    return current;
                }
                return 'index out of range';
            }

    8.查询值的位置

            indexOf(element){
                let current = this.head;
                for(let i = 0; i < this.count; i++){
                    if(current.element === element){
                        return i;
                    }
                    current = current.next;
                }
                return -1;
            }

    9.指定位置插入元素

            insert(element,position){
                if(position >=0 && position <= this.count){
                    let node = new Node(element);
                    if(position == 0){
                        if(this.head === undefined){
                            this.head = node;
                        }else{
                            node.next = this.head;
                            this.head = node;
                        }
                    }else if(position == this.count){
                        let current = this.getElementAt(position - 1);
                        current.next = node;
                    }else{
                        let previous = this.getElementAt(position - 1);
                        let current = previous.next;
                        node.next = current;
                        previous.next = node;                    
                    }
                    this.count++;
                }
                return "position out of range";
            }

    10.删除元素

            remove(element){
                if(this.isEmpty())return "linkedlist is null";
                let index = this.indexOf(element);
                this.removeAt(index);
            }

    11.删除指定位置的元素

            removeAt(index){
                if(this.isEmpty())return "linkedlist is null";
                if(index >= 0 && index < this.count){
                    if(index == 0){//这里总是容易被忽略,如果index为0的话,就直接更改this.head
                        this.head = this.head.next;
                    }else{
                        let previous = this.getElementAt(index -1);
                        let current = previous.next;
                        previous.next = current.next;
                       
                    }
                    this.count--;
                }
                return 'index out of range';
            }

    12.打印链表的所有的值

            toString(){
                if(this.isEmpty())return 'linkedlist is null'
                let current = this.head.next;
                let objString = this.head.element;
                for(let i = 1; i < this.count; i++){
                    objString = `${objString},${current.element}`;
                    current = current.next;
                }
                return objString;
            }

    13.完整代码

     class LinkedList {
            constructor(equalsFn = defaultEquals){
                this.head = undefined;
                this.count = 0;
                this.equalsFn = equalsFn;
            }
            size(){
                return this.count;
            }
            isEmpty(){
                return this.size() == 0;
            }
            push(element){
                let node = new Node(element);
                if(this.head == undefined){
                    this.head = node;
                }else{
                    let current = this.head;
                    while(current.next!=null){
                        current = current.next;
                    }
                    current.next = node;
                }
                this.count++;
            }
            getElementAt(index){
                if(index>=0 && index< this.count){
                    let current = this.head;
                    for(let i = 0; i < index && current != null; i++){
                        current = current.next;
                    }
                    return current;
                }
                return 'index out of range';
            }
            indexOf(element){
                let current = this.head;
                for(let i = 0; i < this.count; i++){
                    if(current.element === element){
                        return i;
                    }
                    current = current.next;
                }
                return -1;
            }
            insert(element,position){
                if(position >=0 && position <= this.count){
                    let node = new Node(element);
                    if(position == 0){
                        if(this.head === undefined){
                            this.head = node;
                        }else{
                            node.next = this.head;
                            this.head = node;
                        }
                    }else if(position == this.count){
                        let current = this.getElementAt(position - 1);
                        current.next = node;
                    }else{
                        let previous = this.getElementAt(position - 1);
                        let current = previous.next;
                        node.next = current;
                        previous.next = node;                    
                    }
                    this.count++;
                }
                return "position out of range";
            }
            remove(element){
                if(this.isEmpty())return "linkedlist is null";
                let index = this.indexOf(element);
                this.removeAt(index);
            }
            removeAt(index){
                if(this.isEmpty())return "linkedlist is null";
                if(index >= 0 && index < this.count){
                    if(index == 0){//这里总是容易被忽略,如果index为0的话,就直接更改this.head
                        this.head = this.head.next;
                    }else{
                        let previous = this.getElementAt(index -1);
                        let current = previous.next;
                        previous.next = current.next;
                       
                    }
                    this.count--;
                }
                return 'index out of range';
            }
            toString(){
                let current = this.head.next;
                let objString = this.head.element;
                for(let i = 1; i < this.count; i++){
                    objString = `${objString},${current.element}`;
                    current = current.next;
                }
                return objString;
            }
        }

    14.结果

  • 相关阅读:
    try catch finally语句块中存在return语句时的运行流程
    【Java学习】异常
    【Java学习】面向对象(二)——封装、继承、多态、抽象
    【ASP.NET开发Web项目】vs2019新建ASP.NET空网站,没有出现Default.aspx
    【ASP.NET开发Web项目】VS2019项目模板中没有ASP.NET空网站
    【Java学习】面向对象(一)
    【Java学习】数组的初始化、特点及基础操作(冒泡排序)
    Jmeter接口测试和压力测试的配置和使用
    【Java学习】递归算法之斐波那契数列、100以内的阶乘
    【Java学习】进制转换、二进制原码反码补码和位运算
  • 原文地址:https://www.cnblogs.com/MySweetheart/p/13212220.html
Copyright © 2020-2023  润新知