链表结构的学习
链表结构
- 要存储多个元素,另外一个选择就是链表
- 但不同于数组,链表中的元素在内存中不必是连续的空间
- 链表的每个元素由一个存储元素本身的节点和一个指向下一个元素的引用(有些语言称为指针或者连接)组成
链表结构的优势
- 内存空间不是必须连续的.可以充分利用计算机的内存,实现灵活的内存动态管理
- 链表不必在创建时就确定大小,并且大小可以无限的延伸下去,
- 链表在插入和删除数据时,时间复杂度可以达到O(1).相对数组效率高很多
相对于数组,链表有一些缺点:
- 链表访问任何一个位置的元素时,都需要从头开始访问(无法跳过第一个元素访问任何一个元素)
- 无法通过下标直接访问元素,需要从头一个个访问,直到找到对应的元素。
认识链表
链表类似于火车:有一个火车头,火车头会连接一个节点,节点上有乘客(类似于数据),并且这个节点会连接下一个节点,以此类推
链表的实现
function LinkedList() {
// head属性指向第一个节点
this.head = null;
// 链表的长度
this.length = 0;
function Node(data) {
this.data = data;
this.next = null;
}
// 链表末尾追加元素
LinkedList.prototype.append = function (data) {
var newNode = new Node(data);
// 判断添加的是否是第一个节点
if (this.length === 0) {
this.head = newNode;
} else {
var current = this.head; // 找到最后一个节点
while (current.next) {
current = current.next;
}
current.next = newNode;
}
this.length += 1;
};
LinkedList.prototype.toString = function () {
var current = this.head;
var str = "";
// 循环获取一个节点
while (current) {
str += current.data + " ";
current = current.next;
}
return str;
};
}
var ll = new LinkedList();
ll.append("aaa");
ll.append("bbb");
ll.append("ccc");
console.log(ll.toString());