我正在嘗試從頭開始在 Golang 中實作 LinkedList 操作。但是我在處理洗掉第一個元素時發現了一個問題。我的方法是使用 OOP 樣式,但似乎第一個元素沒有被洗掉。這是我寫的代碼
type LinkedList struct {
Value int
next *LinkedList
}
func (ll *LinkedList) Remove(index int) error {
pointer := ll
var pointerPrev *LinkedList = nil
current := 0
for current < index {
pointerPrev = pointer
pointer = pointer.next
current
}
if pointer == ll {
ll = ll.next // this line is problematic
pointer = nil
} else {
if pointer.next == nil {
pointerPrev.next = nil
} else {
pointerPrev.next = pointer.next
pointer = nil
}
}
return nil
}
有什么建議我如何在不回傳新的 LinkedList 指標的情況下實作這種洗掉方式?
uj5u.com熱心網友回復:
一切都作為副本傳遞,因此您只能在傳遞指向它的指標時更改某些內容,并且修改指向的值。
所以你不能做你想做的事,而不必回傳新的串列頭(你必須在呼叫者處分配)。
另一種方法是傳遞頭指標的地址(型別**LinkedList),這很丑陋(必須始終傳遞頭指標的地址)。您還可以添加一個單獨的方法來洗掉第一個元素,例如RemoveFirst(),因此您只需傳遞給此方法即可。這RemoveFirst()也可以回傳呼叫者必須分配的新頭。這RemoveFirst()也可以是“常規”函式而不是方法。
另一種選擇是為串列創建一個包裝器,其中包含指向頭部的指標。你在包裝器上實作方法,而不是在節點型別上。包裝器的一個方法可以改變持有頭指標的欄位。
請參閱相關:可以將結構指標方法中的指標重新分配給另一個實體嗎?
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/443000.html
上一篇:go中的顏色操作
下一篇:如何在Go的介面中使用函式型別
