«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Перевернуть связанный список в go

Перевернуть связанный список в go

Опубликовано 31 июля 2024 г.
Просматривать:428

Reverse a linked list in go

Это любимый вопрос, который задают начинающим разработчикам. Довольно просто, если у вас есть приличный класс по структурам данных.

Реверс одного связанного списка. (Это Leetcode 206)

Для реализации я решил сделать связанный список общим типом.

type Node[T any] struct {
    Data T
    Next *Node[T]
}

type LinkedList[T any] struct {
    Head *Node[T]
}

func (ll *LinkedList[T]) Append(data T) {
    newNode := &Node[T]{Data: data, Next: nil}

    if ll.Head == nil {
        ll.Head = newNode
        return
    }

    current := ll.Head
    for current.Next != nil {
        current = current.Next
    }
    current.Next = newNode
}

А для обратной функции это делается за один проход, поскольку все, что нам нужно сделать, это сохранить указатель на предыдущий узел, а затем установить значение «next» данного узла на предыдущий.

Когда мы доходим до конца, мы знаем, что текущий узел является новым «головой» списка.

func (ll *LinkedList[T]) ReverseLinkedList() {
    var prev *Node[T] = nil
    var ptr *Node[T] = ll.Head
    for ptr != nil {
        var next *Node[T] = ptr.Next
        ptr.Next = prev
        prev = ptr
        if next == nil {
            ll.Head = ptr
        }
        ptr = next
    }
}

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

Спасибо!

Код этого поста и всех постов этой серии можно найти здесь

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/johnscode/reverse-a-linked-list-in-go-583i?1. В случае нарушения авторских прав свяжитесь с [email protected], чтобы удалить ее.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3