Связанные списки — это фундаментальная структура данных, используемая для хранения коллекций данных и управления ими. В отличие от массивов, связанные списки не требуют непрерывного блока памяти. Вместо этого связанные списки состоят из отдельных узлов, которые динамически выделяются и соединяются посредством указателей. В этой статье мы рассмотрим различные методы реализации связанных списков в памяти и предоставим примеры кода для каждого подхода.
- Односвязный список.
Наиболее распространенным типом связанного списка является односвязный список, в котором каждый узел содержит данные и указатель на следующий узел. Вот пример реализации односвязного списка в Python:
class Node:
def __init__(self, data):
self.data = data
self.next = None
class LinkedList:
def __init__(self):
self.head = None
def insert(self, data):
new_node = Node(data)
if self.head is None:
self.head = new_node
else:
current = self.head
while current.next:
current = current.next
current.next = new_node
- Двухсвязный список.
В двусвязном списке каждый узел содержит дополнительный указатель на предыдущий узел. Это позволяет более эффективно перемещаться в обоих направлениях. Вот пример реализации двусвязного списка в C++:
struct Node {
int data;
Node* prev;
Node* next;
};
class DoublyLinkedList {
private:
Node* head;
public:
DoublyLinkedList() {
head = nullptr;
}
void insert(int data) {
Node* new_node = new Node();
new_node->data = data;
new_node->prev = nullptr;
new_node->next = nullptr;
if (head == nullptr) {
head = new_node;
} else {
Node* current = head;
while (current->next) {
current = current->next;
}
current->next = new_node;
new_node->prev = current;
}
}
};
- Круговой связанный список.
В циклическом связанном списке последний узел указывает на первый узел, а не имеет значение NULL. Это позволяет осуществлять циклический обход. Вот пример реализации циклического связанного списка в Java:
class Node {
int data;
Node next;
Node(int data) {
this.data = data;
next = null;
}
}
class CircularLinkedList {
Node head;
void insert(int data) {
Node new_node = new Node(data);
if (head == null) {
head = new_node;
head.next = head;
} else {
Node current = head;
while (current.next != head) {
current = current.next;
}
current.next = new_node;
new_node.next = head;
}
}
}
Связанные списки – это универсальная структура данных, которую можно реализовать различными способами в соответствии с различными потребностями. В этой статье мы рассмотрели три распространенных метода реализации связанных списков: односвязные списки, двусвязные списки и циклические связанные списки. Каждый метод имеет свои преимущества и варианты использования. Понимая эти различные реализации, вы можете выбрать наиболее подходящую для ваших конкретных требований.