删除带有 Go 的链表中的项目

我想从 Go 中的链接列表中删除一个 Node , 我有这个结构和这些方法 :

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}
}

我要删除这样一个项目 :

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
}

打印出来的项目是 35, 而不是 1, 4 and 5 。 我在 Python 中重新实现了这个代码并得到了预期的答案。 去干什么 ? 我有预感一定要用指针做点什么。


EN From: Removing an item in a Linked List with Go

2 Comments

  1. 返回要遍历的节点时会丢失头部。 你还在打印错误的对象

    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
        }
    }
    
  2. Remove 不返回列表的头部。 尽管名称不同 , head 是您的迭代变量。

More articles:

  • Vuejs 项目中带有 3 JS 的导入图像
  • 删除带有空格或"-"的单词
  • 添加或删除带有范围滑块的元素的类
  • 为什么 jQuery 在填充带有样式标记的 iframe 时会删除身体和头部标记 , 而不是没有。
  • 如何以编程方式从所有客户购物车中删除项目
  • NetBeans 在带有远程 JPDA 调试的 maven 项目中"应用代码更改"时不重新加载任何类
  • 删除指定给该节点的链表指针的最后一个节点
  • 使用已分类 ( ) 添加和删除带有复选框的类
  • 在带有蒙戈德的 rails 项目中 , 是否有方法可以默认设置 attr_access ?
  • 使用带有纯 java web 项目的 Spring Cloud Foundry 项目
  • 删除带有 LINQ 的"多列"列表的重复条目
  • 在移动源控项后删除 TFS 中的团队项目
  • 从 ASP.NET 核心 1.1 项目的发布输出中删除文件夹
  • 我有一个带有列表框的用户表单 , 但是当我显示用户表单时 , 列表框是空的 , 但是当我不显示时 , 我可以看到项目
  • 如何删除 mongodb shanty 库中带有一些 id 的文档
  • 如何从 Checked Listbox 中删除选定项目的文件夹
  • 在 android 中定位带有特定项目的商店
  • 删除 Eclipse 中不使用的 Android 或 / 和 Java 项目中的类
  • 如何在长时间点击列表视图项目时创建编辑删除对话框。 android
  • 当列表中的项目符合特定标准时 , 如何删除 r行
  • 为什么. pop ( pop ) 最终会停止并且不会一直删除列表中的项目 , 直到列表空了为止 ?
  • Java - 删除 ArrayList 中的项目
  • 为什么链表删除和插入操作具有 O⑴ 的复杂性? 那不是 On (n) 吗
  • 删除项目后单击浏览器后退按钮返回到已删除项目详细视图
  • 从二进制搜索树中删除带有两个子节点的特定节点
  • 带有按钮设置的 android Spinner 项目
  • 如何从"collections.defaultdictt"中删除一个项目?
  • 如何安装和测试带有 Gradle 和 Android-Studio 的 Android 图书馆项目 ?
  • 删除带有 costum list适配器的 android 上的 SQLite 一行
  • 从 Xcode 4 项目中删除 git