国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Rust踩雷筆記(5)——刷點鏈表的題(涉及智能指針Box,持續(xù)更新)

這篇具有很好參考價值的文章主要介紹了Rust踩雷筆記(5)——刷點鏈表的題(涉及智能指針Box,持續(xù)更新)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

只能說Rust鏈表題的畫風(fēng)和C++完全不一樣,作為新手一時間還不太適應(yīng),于是單獨為鏈表、智能指針開一篇,主要記錄leetcode相關(guān)題型的答案以及注意事項。

??關(guān)鍵操作
as_ref()Option<T>、&Option<T>或者&mut Option<T>轉(zhuǎn)換為Option<&T>
as_mut()Option<T>、&mut Option<T>轉(zhuǎn)換為Option<&mut T>,不能對&Option<T>進行轉(zhuǎn)換
??以及注意&&mut叫做借用是非常形象的,既然是借用他人的物品,就不能轉(zhuǎn)移他人物品的所有權(quán)
如果要拿走他人物品的所有權(quán),請使用take()
??l1 = p.next這個操作是希望把節(jié)點p的next賦給l1,但實際上如果p是對Box<ListNode>的可變借用,就會報錯,因為這個過程會有所有權(quán)轉(zhuǎn)移,p既然是借用,它就無權(quán)處置“物主”擁有的物品。所以此時用take(),l1 = p.next.take()表示通過p這個借用,將所有權(quán)“拿走”給l1,并將p.next設(shè)置為None。總之如果要通過借用來轉(zhuǎn)移所有權(quán),可以使用take()

leetcode 2 兩數(shù)相加——模式匹配+單鏈表+Box

??兩個注意點
??里面有官方提供的單鏈表的實現(xiàn),可以參考下;
??遍歷鏈表可以用loop+match模式匹配的方式

// 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
    }
  }
}

impl Solution {
    pub fn add_two_numbers(l1: Option<Box<ListNode>>, l2: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
        let mut t = (l1, l2, 0, 0);
        let mut result = None;
        let mut tail = &mut result;
        loop {
            t = match t {
                (None, None, _, 0) => break,
                (Some(l1), Some(l2), _, mut carry) => {
                    let temp = l1.val + l2.val + carry;
                    let res_temp = temp % 10;
                    carry = temp / 10;
                    (l1.next, l2.next, res_temp, carry)
                }
                (Some(l), None, _, mut carry) | (None, Some(l), _, mut carry) => {
                    let temp = l.val + carry;
                    let res_temp = temp % 10;
                    carry = temp / 10;
                    (l.next, None, res_temp, carry)
                }
                (None, None, _, carry) => {
                    (None, None, carry, 0)
                }
            };
            *tail = Some(Box::new(ListNode::new(t.2)));
            tail = &mut tail.as_mut().unwrap().next;
        }
        result
    }
}

??#[inline] 是什么?
是Rust 中的一個屬性,用于提示編譯器嘗試對函數(shù)進行內(nèi)聯(lián)展開優(yōu)化。 內(nèi)聯(lián)展開是一種優(yōu)化技術(shù),可以將函數(shù)調(diào)用的地方替換為函數(shù)體的內(nèi)容,減少了函數(shù)調(diào)用的開銷,提高代碼的執(zhí)行速度。 通過在函數(shù)定義之前使用 #[inline] 屬性,你可以向編譯器發(fā)出建議,讓它在合適的情況下嘗試內(nèi)聯(lián)展開函數(shù)。

另一個解法,更像是C++或者Java選手的思維文章來源地址http://www.zghlxwxcb.cn/news/detail-671445.html

impl Solution {
    pub fn add_two_numbers(l1: Option<Box<ListNode>>, l2: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
        let (mut l1, mut l2) = (l1, l2);
        let mut head = Box::new(ListNode::new(0));
        let mut p = &mut head;
        let mut carry = 0;
        let mut temp = 0;
        while let (Some(node1), Some(node2)) = (l1.as_ref(), l2.as_ref()) {
            temp = node1.val + node2.val + carry;
            p.next = Some(Box::new(ListNode::new(temp % 10)));
            p = p.next.as_mut().unwrap();
            carry = temp / 10;
            l1 = l1.unwrap().next;
            l2 = l2.unwrap().next;
        }
        while let Some(node) = l1.as_ref() {
            temp = node.val + carry;
            p.next = Some(Box::new(ListNode::new(temp % 10)));
            p = p.next.as_mut().unwrap();
            carry = temp / 10;
            l1 = l1.unwrap().next;
        }
        while let Some(node) = l2.as_ref() {
            temp = node.val + carry;
            p.next = Some(Box::new(ListNode::new(temp % 10)));
            p = p.next.as_mut().unwrap();
            carry = temp / 10;
            l2 = l2.unwrap().next;
        }
        if carry != 0 {
            p.next = Some(Box::new(ListNode::new(carry)));
            p = p.next.as_mut().unwrap();
        }
        head.next
    }
}

??????leetcode 21 合并有序鏈表——as_ref()、as_mut()、take()的使用

// 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
//     }
//   }
// }
impl Solution {
    // 對于鏈表而言,下面兩個操作非常關(guān)鍵
    // as_ref()將Option<T>、&Option<T>或者&mut Option<T>轉(zhuǎn)換為Option<&T>
    // as_mut()將Option<T>、&mut Option<T>轉(zhuǎn)換為Option<&mut T>,不能對&Option<T>進行轉(zhuǎn)換
    // ??以及注意&和&mut叫做借用是非常形象的,既然是借用他人的物品,就不能轉(zhuǎn)移他人物品的所有權(quán)
    // 如果要拿走他人物品的所有權(quán),請使用take()
    
    // 堆上創(chuàng)建頭結(jié)點
    pub fn merge_two_lists(mut l1: Option<Box<ListNode>>, mut l2: Option<Box<ListNode>>) -> Option<Box<ListNode>> {
        // 對于鏈表而言,下面兩個操作非常關(guān)鍵
        // as_ref()將Option<T>、&Option<T>或者&mut Option<T>轉(zhuǎn)換為Option<&T>
        // as_mut()將Option<T>、&mut Option<T>轉(zhuǎn)換為Option<&mut T>,不能對&Option<T>進行轉(zhuǎn)換
        // ??以及注意&和&mut叫做借用是非常形象的,既然是借用他人的物品,就不能轉(zhuǎn)移他人物品的所有權(quán)
        // 如果要拿走他人物品的所有權(quán),請使用take()
        
        // 堆上創(chuàng)建頭結(jié)點
        let mut head = Box::new(ListNode::new(0));
        let mut p = &mut head;  // 尾節(jié)點的可變借用
        while let (Some(node1), Some(node2)) = (l1.as_ref(), l2.as_ref()) {
            if node1.val < node2.val {
                p.next = l1;
                p = p.next.as_mut().unwrap();
                l1 = p.next.take();	// 將p.next擁有的轉(zhuǎn)移給l1,并設(shè)置p.next為None
            }
            else {
                p.next = l2;
                p = p.next.as_mut().unwrap();
                l2 = p.next.take();
            }
        }
        if l1.is_some() {
            p.next = l1;
        }
        else {
            p.next = l2;
        }
        head.next
    }
}

到了這里,關(guān)于Rust踩雷筆記(5)——刷點鏈表的題(涉及智能指針Box,持續(xù)更新)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 算法通關(guān)村第一關(guān)---鏈表經(jīng)典問題之兩個鏈表的第一個公共節(jié)點筆記

    源碼地址:GitHub-算法通關(guān)村 1.hash 2.集合 3.棧 4.雙指針

    2024年02月16日
    瀏覽(24)
  • 青島大學(xué)_王卓老師【數(shù)據(jù)結(jié)構(gòu)與算法】Week04_04_雙向鏈表的插入_學(xué)習(xí)筆記

    青島大學(xué)_王卓老師【數(shù)據(jù)結(jié)構(gòu)與算法】Week04_04_雙向鏈表的插入_學(xué)習(xí)筆記

    本文是個人學(xué)習(xí)筆記,素材來自青島大學(xué)王卓老師的教學(xué)視頻。 一方面用于學(xué)習(xí)記錄與分享,另一方面是想讓更多的人看到這么好的《數(shù)據(jù)結(jié)構(gòu)與算法》的學(xué)習(xí)視頻。 如有侵權(quán),請留言作刪文處理。 課程視頻鏈接: 數(shù)據(jù)結(jié)構(gòu)與算法基礎(chǔ)–第04周04–2.5.4雙向鏈表2–雙向鏈表

    2024年02月12日
    瀏覽(22)
  • 詳解鏈表oJ<反轉(zhuǎn)鏈表,鏈表的中間節(jié)點及鏈表的回文>

    詳解鏈表oJ<反轉(zhuǎn)鏈表,鏈表的中間節(jié)點及鏈表的回文>

    hello,大家好,這里是Dark FlameMaster,今天和大家分享的是有關(guān)數(shù)據(jù)結(jié)構(gòu)鏈表的幾道題目,鏈表的中間節(jié)點,反轉(zhuǎn)鏈表及判斷鏈表是否為回文結(jié)構(gòu),放在一起講解會印象更加深刻。 鏈接:鏈表的中間節(jié)點 分析: ?如果想要得到鏈表的中間節(jié)點,最簡單的思路就是從頭結(jié)點遍歷整

    2024年02月08日
    瀏覽(89)
  • 【數(shù)據(jù)結(jié)構(gòu)】反轉(zhuǎn)鏈表、鏈表的中間節(jié)點、鏈表的回文結(jié)構(gòu)(單鏈表OJ題)

    【數(shù)據(jù)結(jié)構(gòu)】反轉(zhuǎn)鏈表、鏈表的中間節(jié)點、鏈表的回文結(jié)構(gòu)(單鏈表OJ題)

    正如標題所說,本文會圖文詳細解析三道單鏈表OJ題,分別為: ?反轉(zhuǎn)鏈表 (簡單) ?鏈表的中間節(jié)點 (簡單) ?鏈表的回文結(jié)構(gòu) (較難) 把他們放在一起講的原因是: ?反轉(zhuǎn)鏈表 和 ?鏈表的中間節(jié)點 是 ?鏈表的回文結(jié)構(gòu) 的基礎(chǔ) 為什么這樣說?請往下看: 目錄 1. 反轉(zhuǎn)鏈

    2024年02月13日
    瀏覽(104)
  • 定義一個函數(shù),輸入一個鏈表的頭結(jié)點,反轉(zhuǎn)該鏈表并輸出反轉(zhuǎn)后鏈表的頭結(jié)點。

    /** ?* Definition for singly-linked list. ?* struct ListNode { ?* ? ? int val; ?* ? ? ListNode *next; ?* ? ? ListNode(int x) : val(x), next(NULL) {} ?* }; ?*/ class Solution { public: ? ? ListNode* reverseList(ListNode* head) { ? ? ? ?? ? ? } };

    2024年02月22日
    瀏覽(23)
  • 【鏈表OJ 3】鏈表的中間結(jié)點

    【鏈表OJ 3】鏈表的中間結(jié)點

    前言:? ? ? ? ? 本文收錄于http://t.csdn.cn/n6UEP數(shù)據(jù)結(jié)構(gòu)刷題的博客中,首先歡迎大家的來訪,其次如有錯誤,非常歡迎大家的指正!我會及時更正錯誤! 目錄 一.鏈表的中間結(jié)點? 1.1原理:快慢指針的使用 鏈表元素個數(shù)為奇數(shù)時 鏈表元素個數(shù)為偶數(shù)時 1.2循環(huán)條件問題? 來源:87

    2024年02月14日
    瀏覽(61)
  • 【鏈表OJ題 6】鏈表的回文結(jié)構(gòu)

    【鏈表OJ題 6】鏈表的回文結(jié)構(gòu)

    目錄 題目來源: 代碼實現(xiàn): 思路分析: 實現(xiàn)過程: 鏈表的回文結(jié)構(gòu)_牛客題霸_??途W(wǎng) (nowcoder.com) 題目描述: 本題的難點在于時間復(fù)雜度為O(n),空間復(fù)雜度為O(1)。 因為回文結(jié)構(gòu)是正著讀反著讀是一樣的,因此我們 找到鏈表的中間結(jié)點,然后從中間節(jié)點開始逆置到尾結(jié)點,

    2024年02月06日
    瀏覽(17)
  • <數(shù)據(jù)結(jié)構(gòu)> 鏈表 - 鏈表的概念及結(jié)構(gòu)

    <數(shù)據(jù)結(jié)構(gòu)> 鏈表 - 鏈表的概念及結(jié)構(gòu)

    概念: 鏈表是一種物理存儲結(jié)構(gòu)上非連續(xù)、非順序的存儲結(jié)構(gòu),數(shù)據(jù)元素的 邏輯順序 是通過鏈表中的 指針鏈接 次序?qū)崿F(xiàn)的 1、鏈表由一系列結(jié)點(鏈表中每一個元素稱為結(jié)點)組成。 2、結(jié)點可以在運行時動態(tài)(malloc)生成。 3、每個結(jié)點包括兩個部分:一個是存儲數(shù)據(jù)元素的

    2023年04月09日
    瀏覽(53)
  • 【Leetcode】反轉(zhuǎn)鏈表 合并鏈表 相交鏈表 鏈表的回文結(jié)構(gòu)

    【Leetcode】反轉(zhuǎn)鏈表 合并鏈表 相交鏈表 鏈表的回文結(jié)構(gòu)

    ? 目錄 一.【Leetcode206】反轉(zhuǎn)鏈表 1.鏈接 2.題目再現(xiàn) ?3.解法A:三指針法 二.【Leetcode21】合并兩個有序鏈表 1.鏈接 2.題目再現(xiàn) ?3.三指針尾插法 三.【Leetcode160】相交鏈表 1.鏈接 2.題目再現(xiàn) 3.解法 四.鏈表的回文結(jié)構(gòu) 1.鏈接 2.題目再現(xiàn) ?3.解法 1.鏈接 反轉(zhuǎn)鏈表 2.題目再現(xiàn) ?3.解法

    2024年02月02日
    瀏覽(21)
  • 數(shù)據(jù)結(jié)構(gòu)----鏈表介紹、模擬實現(xiàn)鏈表、鏈表的使用

    數(shù)據(jù)結(jié)構(gòu)----鏈表介紹、模擬實現(xiàn)鏈表、鏈表的使用

    ArrayList底層使用連續(xù)的空間,任意位置插入或刪除元素時,需要將該位置后序元素整體往前或者往后搬移,故時間復(fù)雜度為O(N) 增容需要申請新空間,拷貝數(shù)據(jù),釋放舊空間。會有不小的消耗。 增容一般是呈2倍的增長,勢必會有一定的空間浪費。例如當(dāng)前容量為100,滿了以后

    2024年02月21日
    瀏覽(18)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包