当前位置: 首页 > news >正文

rust学习笔记16-206.反转链表(递归)

rust函数递归在14中已经提到,接下来我们把206.反转链表,用递归法实现

递归函数通常包含两个主要部分:

        基准条件(Base Case):递归终止的条件,避免无限递归。

        递归步骤(Recursive Step):将问题分解为更小的子问题,并调用自身来解决这些子问题。

 //Definition for singly-linked list.
 #[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
     }
   }
 }



pub fn reverse(mut pre : Option<Box<ListNode>>,mut cur : Option<Box<ListNode>>) -> Option<Box<ListNode>> {
    if let Some(mut node) = cur.take() {
        //如果不为空使用temp先保存node.next, 然后让node.next指向pre
        let mut temp = node.next;
        node.next = pre;
        //递归调用
        return reverse(Some(node), temp);    
    } else {
        pre
    }
}
pub fn reverse_list(head: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
  
    let mut pre: Option<Box<ListNode>> = None;

    return reverse(pre, head);
}





// 辅助函数:打印链表内容不转移所有权
fn print_list(head: Option<&Box<ListNode>>) {
    match head {
        Some(node) => {
            let mut current = Some(node); // 初始化当前节点指针
            while let Some(node) = current {
                print!("{} -> ", node.val);
                current = node.next.as_ref(); // 使用 as_ref() 获取对 next 的引用
            }
            println!("None");
        }
        None => {
            println!("链表为空");
        }
    }
}

// 函数:将 i32 数组转换为链表并返回头节点
fn array_to_list(arr: Vec<i32>) -> Option<Box<ListNode>> {
    let mut head: Option<Box<ListNode>> = None;
    let mut current: &mut Option<Box<ListNode>> = &mut head;

    for &val in arr.iter().rev() { // 从后往前构建链表
        let new_node = Box::new(ListNode {
            val,
            next: current.take(), // 取出当前节点并设置为新节点的 next
        });
        *current = Some(new_node); // 更新当前节点
        current = &mut head;       // 指向头节点
    }

    head
}

fn main() { 

    let arr = vec![1, 2, 3, 4, 5];

    // 调用函数创建链表
    let head = array_to_list(arr);

    // 打印链表
    print_list(head.as_ref()); // 使用 as_ref() 避免转移所有权
    let node = reverse_list(head);
    print_list(node.as_ref());

}

总结,用递归首先需要确定终止条件,在翻转链表中,终止条件就是cur为空,然后返回pre, 如果不为空先保存node.next(cur.next)到临时变量temp中,然后node.next=pre,最后递归直到为空返回

相关文章:

  • 用java代码开发一个安卓app,实现账号注册登录
  • 算法训练篇06--力扣611.有效三角形的个数
  • coze ai assistant Task5
  • 相机光学中一些疑难问题的解释
  • 共注意力机制及创新点深度解析
  • 小程序开发中的用户反馈收集与分析
  • Grid布局示例代码
  • ubuntu20如何升级nginx到最新版本(其它版本大概率也可以)
  • 基于carla的模仿学习(附数据集CORL2017)更新中........
  • 虚拟化加密恢复---惜分飞
  • Flink实时统计单词【入门】
  • MySQL -- 索引
  • IOS接入微信方法
  • 压力测试实战指南:JMeter 5.x深度解析与QPS/TPS性能优化
  • ABC395题解
  • 算法系列——有监督学习——4.支持向量机
  • VNA操作使用学习-01 界面说明
  • 洛谷每日1题-------Day25__P1424 小鱼的航程(改进版)
  • 【51单片机实物设计】基于51单片机的声控感光LED灯设计(可以在数码管显示光强或LCD显示年月日时分秒和光强)
  • 拓展 Coco AI 功能 - 智能检索 Hexo 博客
  • 河南信阳拟发文严控预售许可条件:新出让土地开发的商品房一律现房销售
  • 最高降九成!特朗普签署降药价行政令落地存疑,多家跨国药企股价收涨
  • 回望乡土:对媒介化社会的反思
  • A股高开高走:沪指涨0.82%,创指涨2.63%,超4100股收涨
  • 库尔德工人党决定自行解散
  • “犍陀罗艺术与亚洲文明”在浙大对外展出