本文章是自学,也是在csdn上学习的,有借鉴其他博主。
目录
一.什么是链表
链表(Linked list)是一种常见的数据结构,它由一系列节点组成,每个节点包含两个部分:数据域和指针域。数据域用于存储元素值,指针域用于指向链表中下一个节点。链表中的节点是动态分配的,可以根据需要随时插入或删除。
链表的特点是:
- 动态分配内存,可以根据需要随时插入或删除节点。
- 节点之间通过指针相互链接,可以高效地进行遍历操作。
- 链表不支持随机访问,需要从头节点开始逐个遍历。
- 链表在插入和删除节点时,需要进行指针调整操作。
链表的应用非常广泛,例如在排序、查找、动态内存分配等方面都有应用。
二.链表演示
1.单向链表:
1.header指向链表的第一个值
2.链表最后一个指向空null
3.当链表为空时,header指向null
4.链表为(数据域+指针域)
2.双向链表
三.链表的优缺点
链表是一种常见的数据结构,它具有以下优势:
- 动态内存管理:链表中的元素在内存中不必是连续的空间,可以充分利用计算机的内存,实现灵活的内存动态管理。
- 插入和删除操作方便:链表在插入和删除数据时,时间复杂度可以达到O(1),相对数组效率高很多。链表的节点之间是通过指针相互链接的,可以高效地进行遍历操作。
- 节省空间:链表不需要像数组一样预先分配一定的内存空间,可以根据需要随时插入或删除节点,因此可以更充分地利用内存空间。
然而,链表也有一些缺点:
- 访问元素时需要从头节点开始逐个遍历:与数组不同,链表不支持随机访问,需要从头节点开始逐个遍历才能找到目标元素。
- 需要额外的空间存储指针:每个节点除了存储数据外,还需要存储指向下一个节点的指针,因此需要额外的空间来存储这些指针。
- 插入和删除节点时需要调整指针:在链表中插入或删除节点时,需要调整指针来更新节点之间的链接关系,这会增加代码的复杂度和运行时间。
总之,链表和数组各有其优缺点,应根据具体的应用场景选择合适的数据结构。
四.简单示例
单向链表:
单向链表的定义
append
// 单向链表
// 封装单向链表类
function LinkList() {
// 封装一个内部类:节点类
function Node(data) {
this.data = data;
this.next = null;
}
// 属性
// 属性head指向链表的第一个节点
this.head = null;
this.length = 0;
// 1.追加方法
LinkList.prototype.append = function (data) {
// 1.创建新的节点
var newNode = new Node(data)
// 2.判断是否添加的是第一个节点
if (this.length === 0) { //2.1 是第一个节点
// 将head指向newNode
this.head = newNode
} else {
// 先设置一个变量指向当前链表的最后一个节点
var current = this.head
while (current.next) {//当不是最后一个节点,则不断向下指下去
current = current.next
}
// 最后节点的next指向新的节点
current.next = newNode
}
// 3.长度加1
this.length += 1
}
}
let list = new LinkList()
list.append("a")
list.append("b")
list.append("c")
console.log(list);
insert
//insert方法
LinkList.prototype.insert = function(position,data){
// 如果插入位置小于0或大于数值长度,就插入错误
if(position<0 || position>this.length){
return false
}
let newNode = new Node(data)
// 如果插入位置为0
if(position == 0){
newNode.next = this.head
this.head = newNode
}else{
let index = 0
let previous = null
let current = this.head
while(index++ < position){
previous = current
current = current.next
}
newNode.next = current
previous.next = newNode
}
this.length+=1
return true
}
get
LinkList.prototype.get = (position)=>{
if(position<0 || position>this.length){
return false
}
let current = this.head
let index = 0
while(index++<position){
current = current.next
}
return current.data
}