3 回答

TA貢獻1942條經驗 獲得超3個贊
append()返回下一個節點的指針。因此printList(),僅打印從下一個節點開始的節點。如果您想打印列表中的所有節點,您應該添加一個變量來存儲引用該列表起始節點的指針。
func main() {
n := newNode(3)
head := n
head.printList()
n = n.append(4)
head.printList()
n = n.append(5)
head.printList()
n = n.append(6)
head.printList() // 3,4,5,6
}

TA貢獻1863條經驗 獲得超2個贊
這個功能:
func (n *Node) append(val int) (*Node){
for n.next != nil {
n = n.next
}
n.next = newNode(val)
return n
}
一般不返回其原始參數。它返回(假設非空)列表中倒數第二個節點。因此:
n = n.append(4)
添加一個節點holding4到原始節點holding 3,然后返回原始節點holding 3,但是:
n = n.append(5)
將持有 的節點添加5到原始列表,但隨后返回指向持有 的節點的指針4。這就是你4,5,現在看到的原因。出于同樣的原因,后續調用會不斷重復最后兩個元素。
您可以修改您的append函數以保存原始返回值并返回該值:
func (n *Node) append(val int) *Node {
// find current tail
t := n
for t.next != nil {
t = t.next
}
t.next = newNode(val)
return n
}
但總的來說,這仍然不是一個很好的策略:例如,當給定-valued時,這append不起作用??紤]構建一個能夠處理此類情況的列表類型?;蛘?,正如Hsaio 的回答一樣,您可以讓調用者直接掛在頭節點上。如果你這樣做,你可以讓函數返回尾指針:nilnappend
func (n *Node) append(val int) *Node {
n.next = newNode(val)
return n.next
}
然后像這樣使用它:
head := newNode(3)
t := append(head, 4)
t = append(t, 5)
t = append(t, 6)
head.printList()
List(標準 Go 包中已經有一個container/list實現,它可以很好地為您完成這些工作。您可以創建一個整體列表容器實例,而不是直接指向列表中的每個元素,該實例允許您在前面插入, insert-at-back、remove-from-anywhere 等等。這有點尷尬,因為它用于interface{}數據,因此需要類型斷言來獲取每個節點的值。)
- 3 回答
- 0 關注
- 156 瀏覽
添加回答
舉報