返回

在 TypeScript 中操纵链表的数据结构

前端





在 TypeScript 中,我们可以使用类来定义链表的节点。一个节点通常包含两个属性:数据项和指向下一个节点的引用。例如,我们可以定义一个简单的节点类如下:

```typescript
class Node<T> {
  data: T;
  next: Node<T> | null;

  constructor(data: T) {
    this.data = data;
    this.next = null;
  }
}

在上面的代码中,Node 类是一个泛型类,这意味着它可以存储任何类型的数据项。data 属性存储数据项,next 属性存储指向下一个节点的引用。

接下来,我们可以使用 Node 类来构建一个链表。链表通常使用头节点和尾节点来表示链表的开始和结束。头节点指向链表中的第一个节点,尾节点指向链表中的最后一个节点。例如,我们可以定义一个链表类如下:

class LinkedList<T> {
  head: Node<T> | null;
  tail: Node<T> | null;

  constructor() {
    this.head = null;
    this.tail = null;
  }

  // 添加一个节点到链表的尾部
  append(data: T) {
    const newNode = new Node(data);

    if (this.head === null) {
      this.head = newNode;
      this.tail = newNode;
    } else {
      this.tail!.next = newNode;
      this.tail = newNode;
    }
  }

  // 从链表中删除一个节点
  remove(data: T) {
    let current = this.head;
    let previous: Node<T> | null = null;

    while (current !== null) {
      if (current.data === data) {
        if (previous === null) {
          this.head = current.next;
        } else {
          previous.next = current.next;
        }

        if (current === this.tail) {
          this.tail = previous;
        }

        break;
      }

      previous = current;
      current = current.next;
    }
  }

  // 搜索链表中的一个节点
  search(data: T): Node<T> | null {
    let current = this.head;

    while (current !== null) {
      if (current.data === data) {
        return current;
      }

      current = current.next;
    }

    return null;
  }
}

在上面的代码中,LinkedList 类是一个泛型类,这意味着它可以存储任何类型的数据项。head 属性存储链表的头节点,tail 属性存储链表的尾节点。

append 方法用于向链表的尾部添加一个节点。remove 方法用于从链表中删除一个节点。search 方法用于搜索链表中的一个节点。

我们可以使用 LinkedList 类来构建和操作链表。例如,我们可以创建一个链表并向其中添加一些数据项:

const linkedList = new LinkedList<number>();

linkedList.append(1);
linkedList.append(2);
linkedList.append(3);

console.log(linkedList);

输出结果如下:

LinkedList {
  head: Node {
    data: 1,
    next: Node {
      data: 2,
      next: Node {
        data: 3,
        next: null
      }
    }
  },
  tail: Node {
    data: 3,
    next: null
  }
}

我们也可以从链表中删除一个节点:

linkedList.remove(2);

console.log(linkedList);

输出结果如下:

LinkedList {
  head: Node {
    data: 1,
    next: Node {
      data: 3,
      next: null
    }
  },
  tail: Node {
    data: 3,
    next: null
  }
}

我们还可以搜索链表中的一个节点:

const node = linkedList.search(3);

console.log(node);

输出结果如下:

Node {
  data: 3,
  next: null
}

链表是一种非常常用的数据结构,它在 TypeScript 中的应用非常广泛。本文介绍了如何在 TypeScript 中使用类和泛型来构建和操作链表。