2016-03-07 98 views
-1

我很新,去實現鏈接列表並去殺死。下面是我的源代碼在鏈接列表的末尾插入項目

package main 

import "fmt" 

type Node struct { 
    value int 
    next *Node 
} 

func main() { 

    var head *Node 
    for i := 1; i <= 10; i++ { 
    insert(&head, i) 
    } 

    print_list(head) 
} 

func print_list(node_pointer *Node) { 
    if (node_pointer == nil) { 
    return 
    } else { 
    node := *node_pointer 
    fmt.Printf("%d\n", node.value) 
    print_list(node.next) 
    } 
} 

func insert(node_pointer **Node, // pointer to a pointer to a Node 
    value int) { 
    var new_node Node 
    new_node.value = value 

    if (*node_pointer == nil) { 
    fmt.Printf("Empty list\n") 
    *node_pointer = &new_node 
    } else { 
    var cur_node Node = **node_pointer 
    for cur_node.next != nil { 
     cur_node = *cur_node.next 
    } 
    cur_node.next = &new_node 
    fmt.Printf("Add %d\n", (*cur_node.next).value)  } 
} 

輸出是:

Empty list 
Add 2 
Add 3 
Add 4 
Add 5 
Add 6 
Add 7 
Add 8 
Add 9 
Add 10 
1 

換句話說,我不能在鏈接列表的末尾插入一個新的節點。我相信這是由cur_node.next = &new_node引起的,它只能在本地進行更新,但不知道如何解決這個問題。

回答

2

的問題是在你插入功能 - 這裏是一個修正版本

func insert(node_pointer **Node, // pointer to a pointer to a Node 
    value int) { 
    var new_node Node 
    new_node.value = value 

    if *node_pointer == nil { 
     fmt.Printf("Empty list\n") 
     *node_pointer = &new_node 
    } else { 
     var cur_node *Node = *node_pointer 
     for cur_node.next != nil { 
      cur_node = cur_node.next 
     } 
     cur_node.next = &new_node 
     fmt.Printf("Add %d\n", (*cur_node.next).value) 
    } 
} 

Playground

+0

它的工作原理!非常感謝你。但是,您能否提供關於我的功能問題的更多解釋。乾杯 –

+1

你在原來的文章中解釋了這個問題 - '我相信這是由cur_node.next =&new_node造成的,它只在本地進行更新。解決的辦法是使用一個指針而不是對象,所以我只拿走了一個間接級別。 –

1

你的錯誤,因爲你得到的節點值,而不是指針的位置:

var cur_node Node = **node_pointer 

*note_pointer是一個指向列表頭的指針,但是您使用的是**node_pointer,那麼您將獲得該值,然後將該值複製到cur_node,之後新節點將被追加到cur_node,與頭節點無關。所以當你打印頭節點時,只能得到頭節點的值。

固定解決方案就像@尼克克雷格伍德說。