javascript实现链表

664 阅读2分钟

1.这里我们实现的是单向链表,首先我们要理解什么是链表,链表就是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。

2.在js中我们没有具体的指针操作,那是因为js底层帮我们实现了,例如:

var a = {name: 'li', age: 100};

在这样一串代码中,js底层帮助我们创建了{name: 'li', age: 100}这样一个对象在堆内存中,并把表示这个对象在内存中的位置的指针赋值给了a变量。

3.具体到代码里,我们就用这样一个类:

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

通过new的方式创建新的链表中的成员,并通过linklist的类来进行链表的一些基本操作,例如:删除、头部新增、底部新增、成员插入的操作,具体实现如下:

 const linkList =  (function(){
            //生成链表中的成员
            class Node {
                constructor(element){
                    this.element = element;
                    this.next = null;
                }
            }
            // 因为链表中的头部位置和长度为私有属性,所以用weakmap
            let head = new WeakMap();
            let len = new WeakMap();
            // 链表操作对象
            return class linkList {
                constructor(){
                    len.set(this,0);
                    head.set(this,null);
                };
                //在最后增加链表对象
                append(element){
                    const node = new Node(element);
                    if(this.getHead() === null){
                        head.set(this,node);
                        this.addLen();
                    }else{
                        let lastNode = this.getHead();
                        while(lastNode.next){
                            lastNode = lastNode.next;
                        };
                        lastNode.next = node;
                        this.addLen();
                    }
                    return this.getHead();
                };
                // 在中间插入链表对象
                insert(position,element){
                    let _position = 0;
                    let node = new Node(element);
                    let positionNode = this.getHead();
                    let positionNextNode = null;
                    console.log(len.get(this));
                    //位置大于初始位置且小于最后位置就正常插入
                    if(position > 0 && position < len.get(this)){
                        while(_position !== position){
                            _position++;
                            positionNode = positionNode.next;
                        };
                        positionNextNode = positionNode.next;
                        positionNode.next = node;
                        node.next = positionNextNode;
                        console.log(this.getHead());
                    };
                    //如果位置在末尾位置就直接调用append
                    if(position === len.get(this)){
                        this.append(element);
                    };
                    //如果位置在初始位置则直接调用unshift
                    if(position === 0)this.unshift(element);
                    return this.getHead();
                };
                //删除链表对象
                del(index){
                    //index必须为有效的位置
                    if(index <= len.get(this) && index >0){
                        let position = 0;
                        let node = this.getHead();
                        let parentNode = null;
                        while(position < index + 1){
                            position ++
                            parentNode = node;
                            node = node.next;
                        }
                        parentNode.next = node.next;
                        node.next = null;
                        return this.getHead();
                    }
                }
                //在链表的头部新增
                unshift(element){
                    let node = new Node(element);
                    node.next = this.getHead();
                    head.set(this,node);
                    return this.getHead();
                };
                // 获取链表头部
                getHead(){
                    return head.get(this);
                };
                // 修改链表的长度变量
                addLen(){
                    let l = len.get(this);
                    l++;
                    len.set(this,l);
                }
            }
        })();
        var list = new linkList();
        list.append(0);
        list.append(1);
        list.append(2);
        list.append(3);
        list.insert(1,1.5);
        list.unshift(-1);
        list.del(3)