Для цикла, работающего бесконечно, при добавлении узла в связанный список

Я новичок в Голанге, пытаюсь реализовать в нем некоторые структуры данных и алгоритмы,

Я написал функцию go, которая добавляет данные в список, но по какой-то причине она переходит в бесконечный цикл. Я уже пробовал различные подходы, но безрезультатно, а также в конечном итоге я искал реальный код для связанного списка в Интернете и нашел разные реализации, но все они застревают на одном месте,

Мой код
// linked-list.go

type Node struct {
    data int
    next *Node
}

type LinkedList struct {
    head *Node
}

func (ll *LinkedList) Add(value int) {
    node := &Node{
        data: value,
    }
    if ll.head == nil {
        ll.head = node
    }

    curr := ll.head
    for curr.next != nil {  // this is where the code gets stuck
        curr = curr.next    // this is not pointing it to the next node
    }

    curr.next = node
}
// main.go

func main() {
    ll := modules.LinkedList{}
    ll.Print()
    ll.Add(1)
    ll.Add(2)
    ll.Print()
}

Некоторые из кодов, которые я пробовал из Интернета

Для справки:

golangprograms
средний блог

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

juanmonroynieto 04.04.2024 23:59

Да, у меня есть, и он практически никогда не переназначает curr на curr.next, что приводит к бесконечному циклу.

Tr4cEr 05.04.2024 00:01

Совет на будущее: с помощью fmt.Printf вы можете печатать адреса указателей, используя %p. Это позволило мне обнаружить несколько неприятных проблем, которые было трудно обнаружить, просто взглянув на окно отладчика. В этом случае вы могли заметить, что узел и следующий узел имели бы один и тот же адрес - адрес головы, которая могла вызвать падение пенни. Отладчики — это здорово, но иногда лучшим другом может оказаться просто старое доброе ведение журнала в консоли.

Gimby 05.04.2024 10:55
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
0
3
59
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

return в состоянии if, когда ll.head == nil. В настоящее время последняя строка функции присваивает head как head.next, создавая таким образом циклический связанный список, который никогда не закончится.

Эй, извини, это была ошибка новичка, оператор return исправил весь поток. Спасибо чувак. :)

Tr4cEr 05.04.2024 00:06

Да, принимаю, там говорится, что мне нужно подождать 2 минуты, прежде чем принять

Tr4cEr 05.04.2024 00:07

Другие вопросы по теме

Как избежать перераспределения массива указателей, если мы не знаем точный размер с самого начала
Рекурсивное построение древовидной структуры данных из массива строк, сохраняющих порядок приоритета
Назначение последних двух циклов while в алгоритме слияния метода сортировки слиянием
Использование переназначения таблицы страниц, чтобы избежать копирования данных во время перераспределения массива
Стратегии повышения эффективности алгоритмов?
Учитывая список игроков, для каждого игрока найдите слева от него более молодого игрока с наибольшей силой
Каков наиболее эффективный способ объединить два больших списка на основе метки времени в С#?
Как реализовать кеш в Python, который эффективно поддерживает операции как со словарем, так и с кучей?
Передайте функцию как параметр функции, чтобы упорядочить связанный список
От инфикса к постфиксу осталась одна скобка в конце, когда выражение полностью заключено