我正在编码一个链表,链表以普通节点开始,以Nil节点结束,这是我的代码:
abstract type LinkedList end
struct Nil <: LinkedList
end
mutable struct Node <: LinkedList
value::Any
nextNode:: LinkedList
end
function append!(headNode::LinkedList, ele::Any)
if isa(headNode, Nil)
headNode = Node(ele, Nil())
return headNode
else
n = headNode
while !isa(n.nextNode, Nil)
n = n.nextNode
end
n.nextNode = Node(ele, n.nextNode)
return headNode
end
end
linkedList() = Nil()
l = linkedList()
当我将元素附加到空链接时,我输入
l = append!(l, 3)
# l is 3 -> Nil
但是我想看起来像这样
append!(l, 3)
# change l without re-assign l
答案 0 :(得分:1)
您好,欢迎来到Stackoverflow。
让我从一般的事情开始。在Julia中,您不能重新分配函数参数,即使其指向其他位置,例如新对象。您只能修改可变类型对象(例如向量)的内容。有关更多详细信息,请参见https://stackoverflow.com/a/39294877/2365675。
基于此,让我们看看代码的作用。您的Nil
类型是不可变的,因此您无法对其进行修改。您正在append!
的第一个分支中创建一个新的Node对象并返回它。但是,Node
对象是可变的,您可以在第二个分支中利用该对象,在第二个分支中,您通过浏览链接列表并指向最后一个(可变)节点,使其指向新节点而不是Nil()
来对其进行修改。因此,您正在修改函数的第一个参数headNode
。
我不确定您想要什么。我建议始终使用l = append(l, 3)
方法(不要修改旧对象)。在我看来,将链表从左侧而不是右侧(在Nil
处)变得更容易,更干净。
无论如何,都有一个包DataStructures.jl,其中也包含一个linked list implementation。我建议您看一看(前14行就足够了),然后事情就会变得更加清晰。