自学内容网 自学内容网

数据结构---链表

单向链表

1、数组是访问元素比较方便,这一节的链表 则是插入与删除更方便。

2、数组的元素地址是强制连续的,但是链表的元素内存地址可以是不连续的 ,它通过地址引用的方式指向下一个元素的位置,所以链表的数据结构看起来比较像一个串。

单向列表的特点

1、在Node元素中,除了本身的数据item之外,往往还会持有一个next对象,它用来指向下一个节点的引用。

2、链表的数据结构也注定了它无法快速的访问某个元素,只能依靠遍历的方式慢慢查找,所以说链表的查询数据是比较慢的,是O(N) 这个级别,但是它在头节点(第一个节点)进行插入和删除比较快,只需要O(1) 就可以了,因为你只需要改变一下第一个元素的引用。

3、我为什么要特意提到头节点呢, 因为如果你想要在尾节点进行插入和删除,势必需要遍历这个链表,找到最后这个链表节点再进行插入,遍历链表的花费是O(N)。

代码简单实现

       class LINK {
            constructor(value) {
                this.value = value;
                this.next = null;
            }
        }

        const a1 = new LINK('第一');
        const a2 = new LINK('第二');
        const a3 = new LINK('第三');
        const a4 = new LINK('第四');

        a1.next = a2;
        a2.next = a3;
        a3.next = a4;

单项循环列表

单项循环列表是一种数据结构,它是由一组节点组成的,每个节点包含一个数据元素和一个指向下一个节点的指针。与普通的单向链表不同的是,最后一个节点的指针指向第一个节点,形成一个环。

代码简单实现

       class LINK {
            constructor(value) {
                this.value = value;
                this.next = null;
            }
        }

        const a1 = new LINK('第一');
        const a2 = new LINK('第二');
        const a3 = new LINK('第三');
        const a4 = new LINK('第四');

        a1.next = a2;
        a2.next = a3;
        a3.next = a4;
        a4.next = a1; // 重点是尾部的next指向头部

双向链表

双向链表在每个节点处都维护了两个指针,一个指向前一个节点(称为前驱节点),另一个指向下一个节点(称为后继节点)。这种设计使得在链表中的任何一个位置,都可以快速地向前或向后遍历

双向链表简单代码实现

       class LINK {
            constructor(value) {
                this.value = value;
                this.next = null;
                this.pre = null;
            }
        }

        const a1 = new LINK('第一');
        const a2 = new LINK('第二');
        const a3 = new LINK('第三');
        const a4 = new LINK('第四');

        a1.next = a2;
        a2.next = a3;
        a2.pre = a1;
        a3.next = a4;
        a3.pre = a2;
        a4.pre = a3;

双向循环链表

双向循环链表是一种链表数据结构,其中每个节点包含指向前一个节点和下一个节点的指针。与普通双向链表不同,双向循环链表的最后一个节点的后继指针指向头节点,第一个节点的前驱指针指向尾节点,形成一个环

简单代码实现

      class LINK {
            constructor(value) {
                this.value = value;
                this.next = null;
                this.pre = null;
            }
        }

        const a1 = new LINK('第一');
        const a2 = new LINK('第二');
        const a3 = new LINK('第三');
        const a4 = new LINK('第四');

        a1.next = a2;
        a1.pre = a4; // 重点是头部的pre指向
        a2.next = a3;
        a2.pre = a1;
        a3.next = a4;
        a3.pre = a2;
        a4.next = a1; // 重点是尾部的next指向
        a4.pre = a3;


原文地址:https://blog.csdn.net/weixin_47808575/article/details/140610949

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!