You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于给定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 22:20:34