Ini ialah soalan kegemaran untuk diberikan kepada pembangun baharu. Agak mudah jika anda mempunyai kelas struktur data yang baik.
Terbalikkan satu senarai terpaut. (Ini ialah Leetcode 206)
Untuk pelaksanaan, saya telah memilih untuk menjadikan senarai terpaut sebagai jenis generik.
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 }
Dan untuk fungsi terbalik, ia dilakukan dengan satu laluan dengan menyedari bahawa semua yang perlu kita lakukan ialah mengekalkan penunjuk ke nod sebelumnya, kemudian menetapkan 'sebelah' nod yang diberikan kepada sebelumnya.
Apabila kita sampai ke penghujung, barulah kita tahu nod semasa ialah 'kepala' baharu senarai.
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 } }
Adakah kita terlepas syarat sempadan? Apakah komplikasi yang ditambah jika senarai itu kini menjadi senarai berganda? Beritahu saya dalam ulasan.
Terima kasih!
Kod untuk siaran ini dan semua siaran dalam siri ini boleh didapati di sini
Atas ialah kandungan terperinci Balikkan senarai terpaut semasa pergi. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!