链表: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