基于给定ListNode结构体,实现从Vec<i32>创建链表并返回头节点
Rust实现create_list函数构建链表
给定不可修改的ListNode结构体及其实现:
#[derive(PartialEq, Eq, Clone, Debug)] pub struct ListNode { pub val: i32, pub next: Option<Box<ListNode>>, } impl ListNode { #[inline] fn new(val: i32) -> Self { ListNode { next: None, val } } }
需要实现create_list函数,接收Vec<i32>作为输入,生成每个元素指向后续元素的链表,最终返回链表的头节点。例如输入[1,2,3],需生成如下结构的链表:
ListNode { val : 1, next: Some(Box::new(ListNode { val : 2, next: Some(Box::new(ListNode { next: None, val : 3 })) })) }
由于Rust的所有权与借用规则,无法在处理过程中保留头节点的引用并返回它。以下是你提供的TypeScript实现思路(已翻译为中文):
class ListNode { val: number next: ListNode | null constructor(val?: number, next?: ListNode | null) { this.val = (val===undefined ? 0 : val) this.next = (next===undefined ? null : next) } toString(): string { return `ListNode ${this.val}${this.next===null? "" : ' => '+ this.next.toString()}` } } function createList(list : number[]) : ListNode|null { const firstItem = new ListNode(0,null); let second = firstItem; for (let item of list) { second.next = new ListNode(item,null) second = second.next; } return firstItem.next; } const firstNodePointer = createList([1,2,3,4,5]) console.log(firstNodePointer?.toString())
Rust实现代码
fn create_list(list : Vec<i32>) -> Option<Box<ListNode>> { // 创建哑节点,简化链表构建逻辑 let mut dummy = Box::new(ListNode::new(0)); // 用可变引用跟踪当前待挂载新节点的位置 let mut current = &mut dummy; for val in list { // 为当前值创建新节点并挂载到current的next current.next = Some(Box::new(ListNode::new(val))); // 将current移动到新节点(unwrap安全,因为刚给next赋值了Some) current = current.next.as_mut().unwrap(); } // 返回哑节点的next,即真正的链表头节点 dummy.next }
实现思路
该实现完全对应你提供的TypeScript思路,通过哑节点规避所有权问题:
- 先创建一个临时哑节点,避免处理空链表的特殊情况
- 用可变引用
current跟踪当前需要挂载新节点的位置 - 遍历输入向量,逐个创建节点并挂载到
current.next,随后将current移动到新节点 - 最后返回哑节点的
next,也就是真正的链表头节点,所有权自然转移,符合Rust的所有权规则
内容的提问来源于stack exchange,提问作者Sina
相关产品推荐
相关产品推荐

