我正在Rust中实现链表数据结构,以尝试学习这门语言。我正在学习一个教程,但我注意到他们的实现只在链表的开始插入一个元素,而不是在它的结尾。我在网上搜索了其他实现,发现它们都做了同样的事情。因此,我开始制作我自己的insert()/add()fn版本。
type NodePointer<T> = Option<Box<ListNode<T>>>;
struct ListNode<T> {
data: T,
next: NodePointer<T>,
}
struct LinkedList<T> {
head: NodePointer<T>,
}
impl<T: std::fmt::Debug> LinkedList<T> {
fn new() -> Self {
Self { head: None }
}
fn insert(&self, input: T) {
let new_node = Some(Box::new(ListNode::<T> {
data: input,
next: None,
}));
let mut head = &self.head;
loop {
match head {
Some(node) => {
println!("passing by {:?}", node.next.as_ref().unwrap().data);
head = &node.next;
},
None => {
head = &new_node;
println!("inserted {:?}", head.as_ref().unwrap().data);
break;
}
}
}
}
}
字符串
不知何故,每当我调用insert()时,我在循环外部初始化的head变量总是值None。有人能指出我做错了什么吗?
1条答案
按热度按时间mw3dktmi1#
要改变列表,很可能需要在
insert()
函数中使用&mut self
。事实上,它编译没有是一个大红旗,有什么是错误的。您的错误是以下行:
字符串
这一行修改的是
head
变量,不是它所指向的!你的意图可能是:
型
现在,突然之间,我们遇到了我已经说过的问题,如果
self
不可变,这是不可能的:型
这可以通过将所有
&
引用更改为&mut
引用来轻松解决。另外,必须修复其中一个
println
。下面是最终的工作代码: