3 回答

TA貢獻(xiàn)1942條經(jīng)驗(yàn) 獲得超3個(gè)贊
append()返回下一個(gè)節(jié)點(diǎn)的指針。因此printList(),僅打印從下一個(gè)節(jié)點(diǎn)開(kāi)始的節(jié)點(diǎn)。如果您想打印列表中的所有節(jié)點(diǎn),您應(yīng)該添加一個(gè)變量來(lái)存儲(chǔ)引用該列表起始節(jié)點(diǎn)的指針。
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貢獻(xiàn)1863條經(jīng)驗(yàn) 獲得超2個(gè)贊
這個(gè)功能:
func (n *Node) append(val int) (*Node){
for n.next != nil {
n = n.next
}
n.next = newNode(val)
return n
}
一般不返回其原始參數(shù)。它返回(假設(shè)非空)列表中倒數(shù)第二個(gè)節(jié)點(diǎn)。因此:
n = n.append(4)
添加一個(gè)節(jié)點(diǎn)holding4到原始節(jié)點(diǎn)holding 3,然后返回原始節(jié)點(diǎn)holding 3,但是:
n = n.append(5)
將持有 的節(jié)點(diǎn)添加5到原始列表,但隨后返回指向持有 的節(jié)點(diǎn)的指針4。這就是你4,5,現(xiàn)在看到的原因。出于同樣的原因,后續(xù)調(diào)用會(huì)不斷重復(fù)最后兩個(gè)元素。
您可以修改您的append函數(shù)以保存原始返回值并返回該值:
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
}
但總的來(lái)說(shuō),這仍然不是一個(gè)很好的策略:例如,當(dāng)給定-valued時(shí),這append不起作用。考慮構(gòu)建一個(gè)能夠處理此類情況的列表類型。或者,正如Hsaio 的回答一樣,您可以讓調(diào)用者直接掛在頭節(jié)點(diǎn)上。如果你這樣做,你可以讓函數(shù)返回尾指針: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(標(biāo)準(zhǔn) Go 包中已經(jīng)有一個(gè)container/list實(shí)現(xiàn),它可以很好地為您完成這些工作。您可以創(chuàng)建一個(gè)整體列表容器實(shí)例,而不是直接指向列表中的每個(gè)元素,該實(shí)例允許您在前面插入, insert-at-back、remove-from-anywhere 等等。這有點(diǎn)尷尬,因?yàn)樗糜趇nterface{}數(shù)據(jù),因此需要類型斷言來(lái)獲取每個(gè)節(jié)點(diǎn)的值。)
- 3 回答
- 0 關(guān)注
- 167 瀏覽
添加回答
舉報(bào)