これは、新しい開発者によく聞かれる質問です。まともなデータ構造クラスを持っていれば非常に簡単です。
単一のリンクされたリストを反転します。 (これはリートコード 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 } }
境界条件を見逃していませんか?リストが二重リンクリストになった場合、どのような複雑さが追加されますか?コメント欄でお知らせください。
ありがとう!
この投稿とこのシリーズのすべての投稿のコードはここにあります
免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。
Copyright© 2022 湘ICP备2022001581号-3