TS实践 - 单链表封装01 | 青训营

122 阅读2分钟

1. 前置知识:TS与泛型

  • TypeScript(简称TS)是一种静态类型检查的 JavaScript 超集,它为 JavaScript 添加了静态类型、类、接口和泛型等特性。
  • 在 TypeScript 中,泛型Generics用于在定义函数、类或接口时使用参数化类型,以增加代码的重用性和类型安全性。泛型允许我们在使用时指定具体的类型,从而使代码能够适用于多种不同的类型。
  • 在 TypeScript 中,泛型可以应用于以下几个方面:
  1. 泛型函数:定义函数时使用泛型类型参数,使函数能够适用于不同类型的参数
  2. 泛型类:定义类时使用泛型类型参数,使类的属性、方法或构造函数能够处理不同类型的数据
  3. 泛型接口:定义接口时使用泛型类型参数,使接口能够适应不同类型的实现
  4. 泛型约束:通过使用泛型约束,可以对泛型类型参数进行限制,以确保只能使用特定类型或其子类型作为类型参数

2. 前置知识:单链表

  • 单链表是一种常见的线性数据结构,由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的引用(指针)
  • 在单链表中,每个节点都只有一个指针指向下一个节点,最后一个节点的指针指向空null,表示链表的结束。通过这种方式,可以将多个节点连接起来形成一个链式结构
  • 单链表的特点:
  1. 动态性:单链表的长度可以根据需要进行动态调整,可以灵活地插入、删除节点
  2. 内存占用:相比数组,单链表的内存占用更加灵活,不需要连续的内存空间
  3. 插入和删除操作效率高:由于只需要修改节点的指针,插入和删除操作的时间复杂度为O(1),效率较高
  4. 随机访问效率低:由于单链表中的节点并没有按照索引排列,所以无法通过索引直接访问到指定位置的元素,需要从头节点开始遍历,时间复杂度为O(n)

3. TS版单链表

  1. 创建Node节点类
class Node<T> {
   value: T
   next: Node<T> | null = null

   constructor(value: T) {
      this.value = value
   }
}
  1. 创建LinkList类
class LinkedList<T> {
   private head: Node<T> | null = null
   private size: number = 0

   get length() {
      return this.size
   }

   //追加节点
   append(value: T) {
      //根据value创建一个新的节点
      const newNode = new Node(value)

      //判断this.head是否为null
      if (!this.head) {
         this.head = newNode

      } else {
         //尾插法
         let current = this.head
         while (current.next) {
            current = current.next
         }

         //current肯定是指向最后一个节点
         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(' -> '))
   }
}