Подсчет узлов в циклически связанном списке: методы и примеры кода

Списки с циклической связью – это тип связанного списка, в котором последний узел указывает на первый узел, создавая циклическую структуру. Подсчет количества узлов в циклически связанном списке требует обхода всего списка и возврата счетчика. В этой статье мы рассмотрим несколько методов выполнения этой задачи, а также приведем примеры кода.

Метод 1: итеративный подход
Итеративный подход предполагает обход циклически связанного списка с использованием цикла, пока мы снова не достигнем начального узла. Мы поддерживаем переменную count, которая увеличивается при каждом обходе.

def count_nodes_iterative(head):
    count = 0
    if head is not None:
        current = head
        while True:
            count += 1
            current = current.next
            if current == head:
                break
    return count

Метод 2: рекурсивный подход
Рекурсивный подход использует рекурсивную функцию для обхода циклически связанного списка до тех пор, пока не будет достигнут начальный узел. Мы передаем текущий узел и головной узел в качестве параметров и увеличиваем счетчик при каждом рекурсивном вызове.

def count_nodes_recursive(current, head):
    if current is None:
        return 0
    if current.next == head:
        return 1
    return 1 + count_nodes_recursive(current.next, head)

Метод 3: Маркерный подход
В этом подходе мы добавляем маркер или флаг к каждому узлу после его подсчета. Мы начинаем с головного узла и проходим по списку, пока не встретим узел с маркером. Мы считаем узлы до тех пор, пока не встретим маркер, и возвращаем счетчик.

def count_nodes_marker(head):
    marker = object()
    count = 0
    current = head
    while current is not marker:
        count += 1
        temp = current
        current = current.next
        temp.next = marker
    return count

Подсчет количества узлов в циклически связанном списке можно выполнить с помощью различных подходов. В этой статье мы исследовали три метода: итеративный подход, рекурсивный подход и маркерный подход. Каждый метод имеет свои преимущества и может быть реализован исходя из требований вашего проекта. Понимая эти методы, вы сможете эффективно подсчитывать узлы в циклически связанном списке и соответствующим образом манипулировать структурой данных.