У кого-нибудь есть код C # для восстановления связанного списка, который циклично работает? - PullRequest
1 голос
/ 18 декабря 2009

как удалить цикл в одном связанном списке?

Прежде чем я напишу некоторый пример кода, чтобы сделать то, что описывает этот ответ, есть ли у кого-нибудь уже пример C # восстановления односвязного списка, который указывает на себя самого?

Я понимаю часть обнаружения (черепаха / заяц), но ремонтная часть немного неясна для меня.

Ответы [ 2 ]

3 голосов
/ 18 декабря 2009

Статья, на которую вы ссылаетесь, имеет алгоритмы, которые позволяют вычислять узел, имеющий две ссылки: одну с начала списка и одну с узла, который должен быть «концом» списка. Если вы можете найти этот узел, то, конечно, вы можете найти узел, который должен быть концом списка. Найдите этот узел. Установите его "следующую" ссылку на ноль.

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

1 голос
/ 18 декабря 2009

Вы найдете «начало» цикла. Это узел, к которому подключено более одного узла.

Один из этих узлов будет из заголовка списка - вы хотите оставить этот в покое.

Другой узел - это тот, который вы хотите изменить - обычно вы подключаете его к null, указывая конец списка.

...