Привет, коллеги-разработчики! Сегодня мы погружаемся в мир циклических связанных списков в TypeScript. Если вы новичок в структурах данных или просто хотите освежить свои знания, вы попали по адресу. В этой статье мы объясним, что такое циклические связанные списки, обсудим их преимущества и варианты использования, а также предоставим примеры кода для различных операций. Итак, начнём!
Что такое циклический связанный список?
Циркулярный связанный список — это вариант традиционного связанного списка, в котором последний узел указывает на первый узел, а не на ноль. Эта циклическая структура обеспечивает эффективный обход и позволяет плавно выполнять операции в списке.
Создание циклического связанного списка.
Чтобы создать циклический связанный список в TypeScript, нам нужно определить класс Node со значением и указателем следующего. Вот пример:
class Node {
value: any;
next: Node | null;
constructor(value: any) {
this.value = value;
this.next = null;
}
}
class CircularLinkedList {
// ...
}
Метод 1: вставка спереди
Чтобы вставить новый узел в начало циклического связанного списка, нам необходимо соответствующим образом обновить указатели следующего. Вот код метода insertAtFront:
class CircularLinkedList {
// ...
insertAtFront(value: any): void {
const newNode = new Node(value);
if (!this.head) {
this.head = newNode;
newNode.next = newNode; // Point to itself in a circular list
} else {
newNode.next = this.head;
let current = this.head;
while (current.next !== this.head) {
current = current.next;
}
current.next = newNode;
this.head = newNode;
}
}
}
Метод 2: вставка в конец
Вставка узла в конец циклического связанного списка требует обновления следующих указателей нового узла и последнего узла. Вот пример реализации метода insertAtEnd:
class CircularLinkedList {
// ...
insertAtEnd(value: any): void {
const newNode = new Node(value);
if (!this.head) {
this.head = newNode;
newNode.next = newNode; // Point to itself in a circular list
} else {
let current = this.head;
while (current.next !== this.head) {
current = current.next;
}
newNode.next = this.head;
current.next = newNode;
}
}
}
Метод 3: удаление спереди
Удаление первого узла в циклическом связанном списке включает соответствующее обновление указателей следующего. Вот код метода deleteAtFront:
class CircularLinkedList {
// ...
deleteAtFront(): void {
if (!this.head) {
return;
}
let current = this.head;
while (current.next !== this.head) {
current = current.next;
}
if (this.head === this.head.next) {
this.head = null;
} else {
current.next = this.head.next;
this.head = this.head.next;
}
}
}
Метод 4: удаление в конце
Для удаления последнего узла в циклическом связанном списке требуется обновить следующие указатели предыдущего узла и последнего узла. Вот пример реализации метода deleteAtEnd:
class CircularLinkedList {
// ...
deleteAtEnd(): void {
if (!this.head) {
return;
}
let current = this.head;
while (current.next.next !== this.head) {
current = current.next;
}
current.next = this.head;
}
}
Поздравляем! Вы изучили основы циклических связанных списков в TypeScript. Мы рассмотрели, как создать циклический связанный список, а также изучили методы вставки и удаления как в начале, так и в конце списка. Циклические связанные списки могут быть полезны в ситуациях, когда вам необходимо непрерывно перебирать коллекцию. Не забудьте попрактиковаться в применении этих методов самостоятельно, чтобы закрепить свое понимание. Приятного кодирования!