doubi6303 2019-06-02 03:31
浏览 29
已采纳

使用Go删除链接列表中的项目

I want to remove a Node from a linked list in Go, and I have this struct and these methods:

type Node struct {
    Next *Node
    Val  int
}

func (n *Node) Append(val int) {
    end := &Node{Val: val}
    here := n
    for here.Next != nil {
        here = here.Next
    }
    here.Next = end
}

func Remove(n *Node, val int) *Node {
    head := n
    for head.Next != nil {
        if head.Next.Val == val {
            head.Next = head.Next.Next
            return head
        }
        head = head.Next
    }
    return head
}

func NewNode(val int) *Node {
    return &Node{Val: val}
}

I want to remove an item like this:


n := NewNode(1)
n.Append(2)
n.Append(3)
n.Append(4)
n.Append(5)

m := Remove(n, 3)

for m != nil {
    fmt.Println(n.Val)
    m = m.Next
}

The items that get printed out are 3 and 5, not 1,2,4and5`. I re-implemented this code in Python and got the expected answer. What is going on in Go? I have a feeling it has to do something with pointers.

  • 写回答

1条回答 默认 最新

  • douliedai4838 2019-06-02 04:01
    关注

    You lose the head from returning a node you use to traverse. Also you are printing out the wrong object

    type Node struct {
        Next *Node
        Val  int
    }
    
    func (n *Node) Append(val int) {
        end := &Node{Val: val}
        here := n
        for here.Next != nil {
            here = here.Next
        }
        here.Next = end
    }
    
    func Remove(n *Node, val int) *Node {
        traverser := n
        for traverser.Next != nil {
            if traverser.Next.Val == val {
                traverser.Next = traverser.Next.Next
                return n
            }
            traverser = traverser.Next
        }
        return n
    }
    
    func NewNode(val int) *Node {
        return &Node{Val: val}
    }
    
    func main() {
        n := NewNode(1)
        n.Append(2)
        n.Append(3)
        n.Append(4)
        n.Append(5)
    
        m := Remove(n, 3)
    
        for m != nil {
            fmt.Println(m.Val)
            m = m.Next
        }
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 Oracle中如何从clob类型截取特定字符串后面的字符
  • ¥15 想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息
  • ¥15 MATLAB中streamslice问题
  • ¥15 如何在炒股软件中,爬到我想看的日k线
  • ¥15 51单片机中C语言怎么做到下面类似的功能的函数(相关搜索:c语言)
  • ¥15 seatunnel 怎么配置Elasticsearch
  • ¥15 PSCAD安装问题 ERROR: Visual Studio 2013, 2015, 2017 or 2019 is not found in the system.
  • ¥15 (标签-MATLAB|关键词-多址)
  • ¥15 关于#MATLAB#的问题,如何解决?(相关搜索:信噪比,系统容量)
  • ¥500 52810做蓝牙接受端