什么是链表?
抽象概念:链表代表了一种唯一指向思想 链表适合用于存储一些经常增加、删除的数据
- 链表中的每个节点至少包含两个部分:数据域与指针域
- 链表中的每个节点,通过指针域的值,形成一个线性结构
- 查找节点O(n),插入节点O(1),删除节点O(1)
- 不适合快速定位数据,适合动态的插入和删除数据的应用场景
几种经典的链表简单实现方法
传统实现方法
class Node{
constructor(data){
this.data = data;
this.prev = null;
this.next = null;
}
}
class SingleList{
constructor(){
this.size = 0;
this.head = new Node('head');
this.lastNode = this.head;
}
append(ele){
let currNode = this.lastNode;
let newNode = new Node(ele);
currNode.next = newNode;
this.size++;
this.lastNode = newNode;
}
}
let list = new SingleList;
list.append(6)
list.append(8)
list.append(2)
list.append(3)
list.append(1)
let p = list.head
while(p){
console.log(p.data)
p = p.next
}
//head -> 6 -> 8 -> 2 -> 3 -> 1
双数组方法
class SingleList{
constructor(){
this.next = [0]
this.data = ['head']
}
add(index,next,val){
this.next[index] = next;
this.data[next] = val
}
}
let list = new SingleList;
list.add(0,3,'地址3的字符串表达')
list.add(3,5,'地址5的字符串表达')
list.add(5,8,'地址8的字符串表达')
list.add(8,2,'地址2的字符串表达')
let p = 0;
while(list.data[p]){
console.log(list.data[p])
p = list.next[p]
}
//head
//地址3的字符串表达
//地址5的字符串表达
//地址8的字符串表达
//地址2的字符串表达
链表的典型应用场景
场景一 :操作系统内的动态内存分配
将内存中的内存碎片通过链表的方式串起来