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

Rust链表peek方法实现问题:移除尾节点并返回数据

问题分析与解决

你的核心问题是无法通过引用操作获取尾节点的所有权并移除它——原代码仅用引用遍历,既没法修改链表结构(比如把倒数第二个节点的next置为None),也没法从引用中取出节点的data(这需要所有权转移)。

要实现移除尾节点并返回数据的逻辑,关键是找到倒数第二个节点,通过修改它的next来移除尾节点,同时处理链表只有一个节点的边界情况。以下是修正后的完整代码:

type Link<T> = Option<Box<Node<T>>>;

struct Node<T> {
    pub data: T,
    pub next: Link<T>,
}

struct List<T> {
    pub head: Link<T>,
}

impl<T> List<T> {
    // 补充测试用到的基础方法
    fn new() -> Self {
        List { head: None }
    }

    fn push(&mut self, data: T) {
        let new_node = Box::new(Node {
            data,
            next: self.head.take(),
        });
        self.head = Some(new_node);
    }

    fn empty(&self) -> bool {
        self.head.is_none()
    }

    // 修正后的peek方法(注:常规命名应为pop_back,因为会移除元素)
    fn peek(&mut self) -> Option<T> {
        // 空链表直接返回None
        if self.head.is_none() {
            return None;
        }

        // 只有一个节点的情况:直接取出head
        if self.head.as_ref().unwrap().next.is_none() {
            return self.head.take().map(|node| node.data);
        }

        // 遍历找到倒数第二个节点
        let mut current = &mut self.head;
        while let Some(node) = current {
            // 当前节点的下下个节点不存在,说明当前是倒数第二个
            if node.next.as_ref().unwrap().next.is_none() {
                // 取出尾节点并返回其data
                return node.next.take().map(|node| node.data);
            }
            // 继续向后遍历
            current = &mut node.next;
        }

        None
    }
}

#[test]
fn peek_test() {
    let mut q = List::new();
    q.push(1);
    q.push(2);
    q.push(3);

    assert_eq!(q.empty(), false);
    assert_eq!(q.peek().unwrap(), 1);
    assert_eq!(q.peek().unwrap(), 2);
    assert_eq!(q.peek().unwrap(), 3);
    assert_eq!(q.empty(), true);
}

关键修正点

  • 边界处理:先判断空链表和单节点链表的情况,简化遍历逻辑。
  • 所有权转移:用take()方法从Option中取出节点所有权(原位置会被置为None),这样才能真正移除节点并取出data。
  • 遍历逻辑:不再遍历到尾节点,而是停在倒数第二个节点——这是单向链表移除尾节点的核心逻辑,因为单向链表无法从尾节点回溯到前一个节点。

内容的提问来源于stack exchange,提问作者qqrm

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 04:02:56