数据结构---链表
单向链表
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)!