Учитывая связанный список, где в дополнение к следующему указателю каждый узел имеет дочерний указатель, который может указывать или не указывать на отдельный список. Эти дочерние списки могут иметь одного или нескольких собственных дочерних элементов и т. Д., Чтобы создать многоуровневую структуру данных, как показано на рисунке ниже. Вам предоставляется глава первого уровня списка. Выровняйте список так, чтобы все узлы отображались в одноуровневом связанном списке. Вы должны сгладить список так, чтобы все узлы на первом уровне были первыми, затем узлы второго уровня и так далее.
Каждый узел является структурой C со следующим определением.
|
Приведенный выше список следует преобразовать в 10-> 5-> 12-> 7-> 11-> 4-> 20-> 13-> 17-> 6-> 2-> 16-> 9-> 8-> 3 -> 19-> 15
Проблема ясно говорит о том, что нам нужно выравнивать уровень за уровнем. Идея решения состоит в том, что мы начинаем с первого уровня, обрабатываем все узлы один за другим, если у узла есть дочерний элемент, то мы добавляем дочерний элемент в конец списка, в противном случае мы ничего не делаем. После обработки первого уровня все узлы следующего уровня будут добавлены после первого уровня. Тот же процесс выполняется для добавленных узлов.
1) Take "cur" pointer, which will point to head of the fist level of the list 2) Take "tail" pointer, which will point to end of the first level of the list 3) Repeat the below procedure while "curr" is not NULL. I) if current node has a child then a) append this new child list to the "tail" tail->next = cur->child b) find the last node of new child list and update "tail" tmp = cur->child; while (tmp->next != NULL) tmp = tmp->next; tail = tmp; II) move to the next node. i.e. cur = cur->next
Ниже приведена реализация вышеуказанного алгоритма.
|
С
|
Джава
|
python3
|
C #
|
Выход:
10 5 12 7 11 4 20 13 17 6 2 16 9 8 3 19 15
Сложность времени: поскольку каждый узел посещается не более двух раз, сложность времени равна O (n), где n — количество узлов в данном связанном списке.
Эта статья составлена Нарендрой Кангралкар . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.
Рекомендуемые посты:
- Найти середину данного связанного списка в C и Java
- Программа для n-го узла из конца связанного списка
- Напишите функцию для получения N-го узла в связанном списке
- Учитывая только указатель / ссылку на узел, который будет удален в односвязном списке, как вы его удаляете?
- Определить петлю в связанном списке
- Напишите функцию для удаления связанного списка
- Напишите функцию, которая подсчитывает, сколько раз данное int встречается в связанном списке.
- Перевернуть связанный список
- Учитывая только указатель на узел, который будет удален в односвязном списке, как вы его удаляете?
- Напишите функцию, чтобы получить точку пересечения двух связанных списков
- Функция, чтобы проверить, является ли односвязный список палиндромом
- Большая проблема рекурсии по списку деревьев.
- Клонировать связанный список со следующим и случайным указателем | Комплект 1
- Эффективный для памяти двусвязный список
- С учетом связного списка, который отсортирован, как вы будете вставлять в отсортированном виде
0.00 (0%) 0 votes