• javascript算法-单链表


    链表相比数组更具灵活性和扩展性。主要有节点数据以及指向节点的指针所构成。

    链表中节点的实现【元素和指针】:

            let Node = function( element ){
                this.element = element;
                this.next = null;
            };

    单链表的实现:

    function LinkedList(){
            let Node = function( element ){
                this.element = element;
                this.next = null;
            };
    
            let head = null;
            let length = 0;
    
            this.append = function( element ){
                let newNode = new Node( element );
                let current = null;
                if( head == null ){
                    head = newNode;
                }else{
                    current = head;
                    while( current.next ) {
                        current = current.next;
                    }
                    current.next = newNode;
                }
                length++;
            };
    
            this.size = function(){
                return length;
            };
    
            this.removeAt = function( pos ){
                if( pos > -1 && pos < length ){
                    var current = head,
                        index = 0,
                        prev = null;
    
                    if( pos == 0 ){
                        head = current.next;
                    }else{
                        while( index++ < pos ){
                            prev = current;
                            current = current.next;    
                        }
                        prev.next = current.next;    
                        length--;
                        return current.element;
                    }
                }else{
                    return null;
                }
            };
    
            this.print = function(){
                let current = head;
                while( current ){
                    console.log( current.element );
                    current = current.next;
                }
            };
    
            this.insert = function( pos, element ){
                let newNode = new Node( element );
                let current, prev, index = 0;
                current = head;
                if( pos >= 0 && pos <= length ){
                    if( pos == 0 ){
                        newNode.next = head;
                        head = newNode;
                    }else{
                        while( index++ < pos ){
                            prev = current;
                            current = current.next;    
                        }
                        newNode.next = current;    
                        prev.next = newNode;
                    }
                    length++;
                    return true;
                }else {
                    return false;
                }
            };
            this.toString = function(){
                let current = head, string = '';
                while( current ){
                    string += current.element + ',';
                    current = current.next;
                }
                return string.substring( 0, string.length - 1 );
            };
            this.indexOf = function( element ){
                let current = head, index = -1;
                while( current ){
                    index++;
                    if( current.element == element ){
                        return index;
                    }
                    current = current.next;
                }
                return -1;
            };
            this.remove = function( element ){
                let pos = this.indexOf( element );
                return this.removeAt( pos );
            };
            this.isEmpty = function(){
                return length == 0;
            };
            this.getHead = function(){
                return head;
            }
        }    
    
    
        var oLink = new LinkedList();
        oLink.append( "java" );
        oLink.append( "php" );
        oLink.append( "javascript" );
        oLink.append( "python" );
    
        oLink.print();
        console.log( "-----------------------节点个数------------------------")
        console.log( oLink.size() );
    
        console.log( "-----------------------删除第2个元素之前------------------------")
        console.log( oLink.removeAt( 2 ) );
        console.log( "-----------------------删除第2个元素之后------------------------")
        oLink.print();
        console.log( "节点个数");
        console.log( oLink.size() );
        console.log( "-----------------------插入节点前------------------------")
        oLink.insert( 0, "c语言" );
        oLink.insert( 3, "c++语言" );
        console.log( "-----------------------插入节点后------------------------")
        oLink.print();
        oLink.insert( 4, "erlang语言" );
        console.log( "-----------------------插入节点后------------------------")
        oLink.print();
        console.log( "-----------------------节点个数------------------------")
        console.log( oLink.size() );
    
        console.log( "-----------------------toString------------------------")
        console.log( oLink.toString() );
        console.log( "------------------------indexOf-----------------------" );
        console.log( oLink.indexOf( "c语言2" ) );
        console.log( "------------------------clear-----------------------" );
        oLink.print();
  • 相关阅读:
    使用灰层覆盖UI时,有事发生
    通过自定义ISAPI Filter来禁止敏感文件的访问
    静态链接库LIB和动态链接库DLL的区别 创建和示例
    深入剖析C++中的string类
    .net c# 序列化和反序列
    ASP.NET 状态服务 及 session丢失问题解决方案总结
    IWAM_账号的用途以及如何同步密码
    COM 组件设计与应用(一)起源及复合文件
    两种古老的WEB编程技术 CGI和ISAPI之间的区别
    Send MSMQ Messages Securely Across the Internet with HTTP and SOAP
  • 原文地址:https://www.cnblogs.com/ghostwu/p/9279671.html
Copyright © 2020-2023  润新知