在链表的末尾插入项目

时间:2016-03-07 22:11:37

标签: go linked-list

我很擅长去实施一个链表。这是我的源代码

 Get-ChildItem D:\Company\SAP\JAN\"BSEG"*.txt -recurse | Move-Item -Destination D:\Company\BSEG 

输出结果为:

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 引起的,它只在本地进行更新,但不知道如何解决这个问题。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

您的错误是因为您获得了节点值,而不是指针:

    var cur_node Node = **node_pointer

*note_pointer是一个指向列表头部的指针,但您使用的是**node_pointer,然后获取该值,然后将此值复制到cur_node,之后将追加新节点至cur_node,与头节点无关。因此,当您的打印表单头节点时,您只能获取头节点的值。

固定解决方案就像@Nick Craig-Wood所说。