如何正确实现Rust单链表按索引修改指定元素值的功能?
错误原因
- 第一个编译错误(E0507):你声明的
curr_node是不可变共享引用,匹配Link::More(mut node)时会尝试将Box<Node>的所有权从引用后转移到局部变量node,而Box没有实现Copytrait,不允许这种move操作;同时你要修改节点元素,本身就需要持有可变引用。 - 第二个编译错误(E0597):匹配得到的
node是循环内的局部变量,你将&node.next赋值给生命周期更长的curr_node,循环结束后node会被销毁,就会出现悬垂引用。 - 额外逻辑问题:你现有代码的索引计数逻辑错误,会跳过索引为0的头节点,永远无法修改第一个元素。
修正后的实现
你需要将遍历的指针改为可变引用,模式匹配时直接获取节点的可变借用,同时调整索引判断逻辑:
impl List { /// Replaces the element at the specified position in this list with the specified element. pub fn set(&mut self, index: usize, elem: i32) -> Result<(), &str> { let mut id = 0; // 持有可变引用才能修改节点内容 let mut curr_node = &mut self.head; while let Link::More(node) = curr_node { if id == index { node.elem = elem; return Ok(()); } // 移动到下一个节点的可变引用 curr_node = &mut node.next; id += 1; } // 循环结束仍未找到对应索引,说明越界 Err("Invalid index") } }
内容的提问来源于stack exchange,提问作者hes_theman
相关产品推荐
相关产品推荐

