链表

链接也是一种存储数据的工具,不同于数组,链表中的元素并不是连续存储的。因此不能通过下标去访问。 链表分为单(向)链表,双向链表,循环链表等。.今天来实现一下单链表。
单链表中的每个元素包括两个两个域,一个是保存元素本身的域,另一个是指向一下一个节点的指针域


    function LinkedList(){
        var Node = function( ele ){
            this.ele = ele;     //ele  属性代表插入的值
            this.next = null;   //  next属性 代表 指向下一个节点的指针
        }
        var head = null;
        var length = 0;


        // 向链表末尾插入一个元素
        this.append = function(ele){
            var node = new Node(ele);
            var currentNode = null;

            if( head === null){    // 列表为空,插入的节点是第一个头结点
                head = node;
            }
            else{
                currentNode = head;
                // 循环链表,直到最后一个节点
                while( currentNode.next !== null ){
                    currentNode = currentNode.next;
                }
                // 出了while循环,说明找到了最后一个节点
                currentNode.next = node;

            }
            length++;
        }
        // 删除链表中指定的某个节点:删除头结点 or  除了头结点以外的节点
        this.removeAt = function( position ){
            var currentNode = head;
            var previousNode = null;
            var index = 0;

            if( position >= 0 && position < length ){
                if( position === 0 ){
                    node = currentNode.next;
                }
                else{
                    while( index++ < position ){
                        previousNode = currentNode;
                        currentNode = currentNode.next;
                    }
                    // 出了while循环, index === position
                    previousNode.next = currentNode.next;
                }
                length--;
                return currentNode.ele
            }
            // 要删除的节点的不存在
            else{

                return -1;
            }
        }
        // 在任意位置插入一个元素
        this.insert = function(){
            // 检查是否越界
            if( position >= 0 && position <= length ){
                var newNode = new Node(ele);
                var currentNode = head;   // 保存一下头结点
                var previousNode = null;
                var index = 0;

                if( position === 0 ){
                   newNode.next = currentNode;
                   head = newNode;
                }
                else{
                    while ( index++ < position ){
                        previousNode = currentNode;
                        currentNode = currentNode.next;
                    }
                    // 出了循环表示找到位置
                    newNode.next = currentNode;
                    previousNode.next = currentNode;
                }
                length++;
                return 1;
            }
            else{
                return -1;
            }
        }

        //查找链表中的某个元素所在位置, 无此元素返回 -1
        this.find = function(ele){
             var currentNode = head;
             var index = 0;
             while( currentNode ){
                if( currentNode.ele = ele ){
                    return index;
                }
                currentNode = currentNode.next;
                index++; 
            }  
            return -1;
        }       

        this.isEmpty = function(){
            return length === 0;
        }

        this.size = function(){
            return length;
        }

    }

下面来实现链表的反转

function reverse( linkedList ){
    var head = linkedList.head;

    // 如果只有一个节点 或者 是空链表
    if( head === null || head.next === null ){
        return;
    }
    var p = head;
    var q = p.next;
    // 反转后的头结点变成尾节点
    head.next = null;
    while(q){
        r = q.next;
        q.next = p;
        p = q;
        q = r;
    }
    // 退出循环后 r = q.next = null, q.next = q; p=q; q=null;
    // p指向原来节点的尾节点, 那么翻转后,尾节点变成头结点
    linkedList.head = p;
}

本文转载:CSDN博客