1. 前置知识:TS与泛型
- TypeScript(简称TS)是一种静态类型检查的 JavaScript
超集,它为 JavaScript 添加了静态类型、类、接口和泛型等特性。
- 在 TypeScript 中,泛型
Generics用于在定义函数、类或接口时使用参数化类型,以增加代码的重用性和类型安全性。泛型允许我们在使用时指定具体的类型,从而使代码能够适用于多种不同的类型。
- 在 TypeScript 中,泛型可以应用于以下几个方面:
- 泛型函数:定义函数时使用泛型类型参数,使函数能够适用于不同类型的参数
- 泛型类:定义类时使用泛型类型参数,使类的属性、方法或构造函数能够处理不同类型的数据
- 泛型接口:定义接口时使用泛型类型参数,使接口能够适应不同类型的实现
- 泛型约束:通过使用泛型约束,可以对泛型类型参数进行限制,以确保只能使用特定类型或其子类型作为类型参数
2. 前置知识:单链表
- 单链表是一种常见的线性数据结构,由一系列
节点组成,每个节点包含一个数据元素和一个指向下一个节点的引用(指针)
- 在单链表中,每个节点都
只有一个指针指向下一个节点,最后一个节点的指针指向空null,表示链表的结束。通过这种方式,可以将多个节点连接起来形成一个链式结构
- 单链表的特点:
- 动态性:单链表的长度可以根据需要进行动态调整,可以灵活地插入、删除节点
- 内存占用:相比数组,单链表的内存占用更加灵活,不需要连续的内存空间
- 插入和删除操作效率高:由于只需要修改节点的指针,插入和删除操作的时间复杂度为O(1),效率较高
- 随机访问效率低:由于单链表中的节点并没有按照索引排列,所以无法通过索引直接访问到指定位置的元素,需要从头节点开始遍历,时间复杂度为O(n)
3. TS版单链表
- 创建Node节点类
class Node<T> {
value: T
next: Node<T> | null = null
constructor(value: T) {
this.value = value
}
}
- 创建LinkList类
class LinkedList<T> {
private head: Node<T> | null = null
private size: number = 0
get length() {
return this.size
}
append(value: T) {
const newNode = new Node(value)
if (!this.head) {
this.head = newNode
} else {
let current = this.head
while (current.next) {
current = current.next
}
current.next = newNode
}
this.size++
}
traverse() {
const values: T[] = []
let current = this.head
while (current) {
values.push(current.value)
current = current.next
}
console.log(values.join(' -> '))
}
}