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指向prelet 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,最后遞歸直到為空返回

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/74011.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/74011.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/74011.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

QT-LINUX-Bluetooth藍牙開發

BlueToothAPI QT-BlueToothApi Qt Bluetooth 6.8.2 官方提供的藍牙API不支持linux。 D-Bus的API實現藍牙 確保系統中安裝了 BlueZ(版本需≥5.56),并且 Qt 已正確安裝并配置了 D-Bus 支持。 默默看了下自己的版本.....D-BUS的API也不支持。 在 D-Bus 中,org 目錄是 D-Bus…

鴻蒙Next開發與未來發展的變革:全場景操作系統的全新紀元

文章目錄 引言&#xff1a;從兼容到自主的跨越式進化一、鴻蒙Next技術架構解析1.1 系統架構全景圖1.1.1 微內核架構優勢 1.2 與OpenHarmony的關系 二、開發范式革命2.1 應用開發模式對比2.1.1 元服務&#xff08;Meta Service&#xff09;定義 2.2 開發工具鏈升級&#xff08;D…

【docker】--- 詳解 WSL2 中的 Ubuntu 和 Docker Desktop 的區別和關系!

在編程的藝術世界里,代碼和靈感需要尋找到最佳的交融點,才能打造出令人為之驚嘆的作品。而在這座秋知葉i博客的殿堂里,我們將共同追尋這種完美結合,為未來的世界留下屬于我們的獨特印記。【WSL 】--- Windows11 遷移 WSL 超詳細指南 —— 給室友換一個宿舍! 開發環境一、引…

利用Python爬蟲獲取Shopee(蝦皮)商品詳情:實戰指南

在跨境電商領域&#xff0c;Shopee&#xff08;蝦皮&#xff09;作為東南亞及臺灣地區領先的電商平臺&#xff0c;擁有海量的商品信息。無論是進行市場調研、數據分析&#xff0c;還是尋找熱門商品&#xff0c;獲取Shopee商品詳情都是一項極具價值的任務。然而&#xff0c;手動…

【OCR】總結github上開源 OCR 工具:讓文字識別更簡單

前言 在數字化的時代&#xff0c;光學字符識別&#xff08;OCR&#xff09;技術成為了我們處理文檔、圖像文字信息的得力助手。它能夠將圖像中的文字信息轉換為可編輯和可處理的文本數據&#xff0c;極大地提高了信息處理的效率。今天&#xff0c;我要給大家介紹一些優秀的開源…

GenICam標準

GenICam的目標是為所有類型的相機提供一個統一的編程接口。無論相機使用的是哪種傳輸協議或實現了哪些功能&#xff0c;編程接口&#xff08;API&#xff09;都是一樣的。 GenICam&#xff08;Generic Interface for Cameras&#xff09;是一個為工業相機和圖像采集設備設計的…

Docker學習筆記(十)搭建Docker私有倉庫

一、環境配置 1、宿主機系統&#xff1a;macOS Sequoia(版本15.2) 2、虛擬機VMware Fusion版本&#xff1a;專業版 13.6.2 (24409261) 3、虛擬機系統&#xff1a;AlmaLinux-9-latest-x86_64-boot.iso 二、安裝Harbor開源企業級Docker鏡像 Harbor 是一個開源的企業級 Docker…

關于微信小程序端base64解碼問題

由于atob是瀏覽器端的&#xff0c;對于微信小程序不支持&#xff0c;導致模擬器【開發工具】顯示正常&#xff0c;但真機異常解析失敗問題&#xff0c;微信小程序原有的api&#xff0c;官方文檔中也廢棄了 解決方案&#xff1a; 調用&#xff1a; const decodedString ba…

鴻蒙NEXT項目實戰-百得知識庫03

代碼倉地址&#xff0c;大家記得點個star IbestKnowTeach: 百得知識庫基于鴻蒙NEXT穩定版實現的一款企業級開發項目案例。 本案例涉及到多個鴻蒙相關技術知識點&#xff1a; 1、布局 2、配置文件 3、組件的封裝和使用 4、路由的使用 5、請求響應攔截器的封裝 6、位置服務 7、三…

Adobe PR和AE2025到啟動頁面一會自動退出

Adobe PR和AE2025到啟動頁面一會自動退出 1查找程序啟動錯誤日志2解決方法3思考共勉 1查找程序啟動錯誤日志 查找程序啟動錯誤日志&#xff1a;事件查看器>Windows日志>應用程序 錯誤應用程序名稱: Adobe Premiere Pro.exe&#xff0c;版本: 25.1.0.73&#xff0c;時間…

Python Pyecharts面試題及參考答案

目錄 使用隨機數據繪制對比某品牌各季度銷量與庫存的柱狀圖,添加副標題和自定義顏色 繪制雙 Y 軸柱狀圖,展示城市人均收入和支出數據,并設置軸標簽旋轉 45 度 實現水平柱狀圖,展示不同編程語言的受歡迎指數,添加數據標簽 繪制動態溫度變化折線圖,包含平滑曲線和標記點…

【css酷炫效果】純CSS實現進度條加載動畫

【css酷炫效果】純CSS實現進度條加載動畫 緣創作背景html結構css樣式完整代碼基礎版進階版 效果圖 通過CSS漸變與背景位移動畫&#xff0c;無需JavaScript即可創建流體動態進度條。 想直接拿走的老板&#xff0c;鏈接放在這里&#xff1a;https://download.csdn.net/download/u…

安全地自動重新啟動 Windows 資源管理器Bat腳本

安全地自動重新啟動 Windows 資源管理器腳本 可以直接運行的 Windows 批處理腳本&#xff0c;用于安全地自動重新啟動 Windows 資源管理器。該腳本會在殺死資源管理器之前檢查是否有其他進程正在使用資源管理器相關的文件。 Bat腳本 echo off title 資源管理器安全重啟工具 co…

【NeurIPS-2022】CodeFormer: 將人臉復原轉化為碼本預測以減少LQ-HQ映射的不確定性

寫在前面&#xff1a;本博客僅作記錄學習之用&#xff0c;部分圖片來自網絡&#xff0c;如需引用請注明出處&#xff0c;同時如有侵犯您的權益&#xff0c;請聯系刪除&#xff01; 文章目錄 前言論文動機方法實驗 總結互動致謝參考往期回顧 前言 盲人臉恢復是一個高度不適定的…

k8s1.30 部署calio網絡

一、介紹 網路組件有很多種&#xff0c;只需要部署其中一個&#xff0c;推薦calio。 calio是一個純三成的數據中心網絡方案&#xff0c;calico支持廣泛的平臺。如k8s&#xff0c;openstack等。 calio在每一個計算節點利用linux內核&#xff0c;實現了一個高效的虛擬路由器來…

提升AI性能的秘密武器:量化、蒸餾與剪枝全面解析

通過高效的模型壓縮技術推進 NLP 在快速發展的自然語言處理 (NLP) 領域,模型的大小和復雜性顯著增加,從而顯著提高了性能。然而,這些龐大模型的部署和維護也帶來了挑戰,特別是在計算成本、功耗和資源受限用戶的可訪問性方面。本博客深入探討了量化、剪枝和蒸餾等尖端模型壓…

數據結構(python)-------棧和隊列2

目錄 二、隊列 &#xff08;一&#xff09;、定義 1. 定義 2. 邏輯結構 3. 存儲結構 4. 運算規則 5. 實現方式 &#xff08;二&#xff09;、隊列與一般線性表的區別 一般線性表 隊列 &#xff08;三&#xff09;、分類 …

基于SpringBoot的“校園招聘網站”的設計與實現(源碼+數據庫+文檔+PPT)

基于SpringBoot的“校園招聘網站”的設計與實現&#xff08;源碼數據庫文檔PPT) 開發語言&#xff1a;Java 數據庫&#xff1a;MySQL 技術&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系統展示 系統整體功能圖 局部E-R圖 系統首頁界面 系統注冊…

投資日記_道氏理論技術分析

主要用于我自己參考&#xff0c;我感覺我做事情的時候容易上頭&#xff0c;忘掉很多事情。 技術分析有很多方法&#xff0c;但是我個人相信并實踐的還是以道氏理論為根本的方法。方法千千萬萬只有適合自己價值觀&#xff0c;習慣&#xff0c;情緒&#xff0c;性格的方法才是好的…

ceph運維硬件規劃技巧

在規劃Ceph集群的硬件配置時&#xff0c;需要綜合考慮性能、成本、冗余、可擴展性以及特殊場景需求等因素。以下是關于Ceph硬件規劃的關鍵技巧和建議&#xff0c;涵蓋存儲設備、網絡、服務器配置、容量規劃、冗余策略等多個方面&#xff1a; 1. 硬件選型建議 存儲設備 存儲節點…