学好React的基础之链表01

234 阅读2分钟

链表:TypeScript实现

链表是计算机科学中一种基本的数据结构,它通过一系列节点来表示一个线性序列。每个节点都包含一个数据元素和一个指向下一个节点的指针。链表在动态内存分配和基于指针的数据结构中非常有用。本文将介绍如何使用TypeScript实现链表,并提供代码示例。

链表基本概念

链表主要有两种类型:单向链表和双向链表。在单向链表中,每个节点只有一个指向下一个节点的指针;而在双向链表中,每个节点还包含一个指向前一个节点的指针。

链表的基本操作包括插入、删除、查找等。下面我们将使用TypeScript来实现一个简单的单向链表。

单向链表实现

首先,我们需要定义链表节点类ListNode,包含数据元素和下一个节点指针。

class ListNode<T> {
  value: T;
  next: ListNode<T> | null;

  constructor(value: T, next: ListNode<T> | null = null) {
    this.value = value;
    this.next = next;
  }
}

接下来,我们实现链表类LinkedList。链表类需要一个指向头节点的指针,以及一些基本操作方法。

class LinkedList<T> {
  private head: ListNode<T> | null;

  constructor() {
    this.head = null;
  }

  // 向链表头部插入元素
  insertAtHead(value: T): void {
    const newNode = new ListNode(value, this.head);
    this.head = newNode;
  }

  // 从链表头部删除元素
  deleteAtHead(): T | null {
    if (this.head === null) {
      return null;
    }
    const value = this.head.value;
    this.head = this.head.next;
    return value;
  }

  // 查找链表中是否存在某个值
  find(value: T): ListNode<T> | null {
    let currentNode = this.head;
    while (currentNode !== null) {
      if (currentNode.value === value) {
        return currentNode;
      }
      currentNode = currentNode.next;
    }
    return null;
  }
}

链表基本操作

以下代码演示了如何使用LinkedList类执行一些基本操作。

const list = new LinkedList<number>();

// 向链表头部插入元素
list.insertAtHead(1);
list.insertAtHead(2);
list.insertAtHead(3);

// 从链表头部删除元素
console.log(list.deleteAtHead()); // 3
console.log(list.deleteAtHead()); // 2

// 查找链表中是否存在某个值
console.log(list.find(1)); // ListNode { value: 1, next: null }
console.log(list.find(2)); // null