js实现数据结构--双链表

双链表的概念:

双链表也叫双向链表,是链表的一种,它的每个数据结点中除了本身的元素节点还有两个指针,分别指向直接后继和直接前驱。所以,从双链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。双链表的结构如下图所示:

双链表的特点: 

  1. 每个数据节点除了本身的元素节点之外,还有两个指针,分别指向直接后继节点和直接前驱结点
  2. 从链表中添加或者删除节点不需要移动其他的节点
  3. 双链表提供了两种迭代列表的方法,可以从头到尾也可以从尾到头,也可以访问一个特点节点的下一个或者前一个节点。

js定义双链表和一些基本的方法:

首先定义一个类似类的结构来表示双链表,在该结构中定义声明一些基本的属性,代码如下:

 //定义双链表
    function DoublyLinkedList() {
        //定义双链表的一些属性
        let Node = function (element) {
            this.element = element;
            this.next = null;
            this.prev = null;
        };

        let length = 0;
        let head = null;
        let tail = null;//双链表有个尾巴
}

同时在该类中定义一些基本的方法,代码如下:

        //定义一些基本的方法
        //在某位置插入一个元素
        this.insert = function (position, element) {
            //检查越界
            if (position >= 0 && position <= length){
                let node = new Node(element);
                //current表示当前的项的变量
                let current = head,
                    previous,index = 0;
                if (position === 0){//要插入的位置是第一个位置
                    if (!head){//当前双链表是空链表,插入的元素成为链表的第一个元素
                        head = node;
                        tail = node;
                    } else {//当前链表不为空,要插入的元素成为第一个元素
                        node.next = current;
                        current.prev = node
                        head = node;
                    }
                } else if (position === length){//要插入的位置是最后一个位置
                    current = tail;
                    current.next = node;
                    node.prev = current;
                    tail = node;
                } else {//要插入的位置是任意的一个位置
                    while (index++ < position){//从双链表的头部开始查找,找到要插入的位置
                        previous = current;
                        current = current.next;
                    }
                    //找到要插入的位置了,开始插入元素
                    node.next = current;
                    previous.next = node;
                    current.prev = node;
                    node.prev = previous;
                }
                length++;
                return true;
            } else {
                return false;
            }
        }



        //从任意位置移除元素
        this.removeAt = function (position) {
            //检查越界值
            if (position > -1 && position < length){
                let current = head;
                let previous ,  index = 0;
                if (position === 0) {//要移除的是第一项
                    head = current.next;
                    //如果链表只有一项,则移除第一项之后,还要更新tail
                    if (length === 1){
                        tail = null;
                    } else {//如果链表不止一项
                        head.prev = null;
                    }
                }else  if (position === length-1){//要移除的是最后一项
                    current = tail;
                    tail = current.prev;
                    tail.next = null;
                } else {
                    while (index++ <position){
                        //从头开始遍历,找到要移除的位置
                        previous = current;
                        current = current.next;
                    }
                    //将previous与current的下一项链接起来---跳过current
                    previous.next = current.next;
                    current.next.prev = previous;
                }
                length--;
                return current.element;
            } else {
                return null;
            }
        }



        //输出双链表中的元素
        this.toString =  function  (){
            let current = head,
                string = '',
                indexCheck = 0;
            while (current && indexCheck < length){
                string += current.element + (current.next ? '-':'');
                current = current.next;
                indexCheck++;
            }
            return string;
        }

使用双链表:

定义一个双链表,并在特定位置插入两个元素,输出双链表,然后再删除某位置上的元素,代码如下:

 let doubleList = new DoublyLinkedList();
    doubleList.insert(0,'12');
    doubleList.insert(1,'33');
    doubleList.insert(2,'56');
    console.log(doubleList.toString());//输出12-33-56
    console.log(doubleList.removeAt(0));//输出12
    console.log(doubleList.toString());//输出33-56

还有一些其他的方法,参照单链表,这里就不赘述了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值