「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go でリンクされたリストを反転する

Go でリンクされたリストを反転する

2024 年 7 月 31 日に公開
ブラウズ:688

Reverse a linked list in go

これは、新しい開発者によく聞かれる質問です。まともなデータ構造クラスを持っていれば非常に簡単です。

単一のリンクされたリストを反転します。 (これはリートコード 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
}

そして、リバース関数については、前のノードへのポインターを維持し、指定されたノードの「次」を前のノードに設定するだけであることを認識することで、シングルパスで実行されます。

最後に到達すると、現在のノードがリストの新しい「先頭」であることがわかります。

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