Rust單鏈表

節(jié)點(diǎn)的結(jié)構(gòu)

希望鏈表存儲(chǔ)在堆上,所以使用 Box 包裹節(jié)點(diǎn) Rust 沒有空值嗤谚,所以用 Option 在包裹一層

#[derive(PartialEq, Eq, Clone, Debug)]
struct ListNode<T> {
    pub data: T,
    pub next: Option<Box<ListNode<T>>>,
}

根據(jù)索引查找節(jié)點(diǎn)和找尾節(jié)點(diǎn)是通過遞歸來查找的

impl<T> ListNode<T> {
    // 新建一個(gè)節(jié)點(diǎn)
    #[inline]
    fn new(data: T) -> ListNode<T> {
        ListNode { next: None, data }
    }
    // 獲取最后的節(jié)點(diǎn)
    fn get_last_node<'a>(&'a mut self) -> &'a mut Self {
        if let Some(ref mut node) = self.next {
            return node.get_last_node();
        }
        self
    }
    // 根據(jù)索引查找節(jié)點(diǎn)
    fn get_index_node<'a>(&'a mut self, cur: usize, index: usize) -> &'a mut Self {
        if cur >= index {
            return self;
        }
        if let Some(ref mut node) = self.next {
            return node.get_index_node(cur + 1, index);
        }
        self
    }
}

鏈表的結(jié)構(gòu)

#[derive(PartialEq, Eq, Clone, Debug)]
struct List<T> {
    pub head: Option<Box<ListNode<T>>>,
    pub length: usize,
}

鏈表插入

鏈表的插入先判斷頭結(jié)點(diǎn)是否為空棺蛛。如果插入的是頭結(jié)點(diǎn)的話,需要將新的節(jié)點(diǎn)的下個(gè)節(jié)點(diǎn)設(shè)置為頭結(jié)點(diǎn)巩步,再將新結(jié)點(diǎn)設(shè)置為頭節(jié)點(diǎn)旁赊。插入的是其他的位置的話,先找到索引的前一個(gè)節(jié)點(diǎn)椅野,將前一個(gè)節(jié)點(diǎn)的下個(gè)節(jié)點(diǎn)設(shè)置為新節(jié)點(diǎn)终畅,將新節(jié)點(diǎn)的下個(gè)節(jié)點(diǎn)設(shè)置為前節(jié)點(diǎn)的下個(gè)節(jié)點(diǎn)。

// 插入
fn insert(&mut self, index: usize, data: T) {
    let mut new_node = ListNode::new(data);
    if let Some(ref mut head) = self.head {
        if index == 0 {
            let head = self.head.take();
            new_node.next = head;
            self.head = Some(Box::new(new_node));
        } else {
            let mut prev_node = head.get_index_node(0, index - 1);
            let next_node = prev_node.next.take();
            new_node.next = next_node;
            prev_node.next = Some(Box::new(new_node));
        }
    } else {
        self.head = Some(Box::new(new_node));
    }
    self.length += 1
}

鏈表刪除

// 刪除
    fn delete(&mut self, index: usize) {
        if let Some(ref mut head) = self.head {
            self.length -= 1;
            if index == 0 {
                self.head = head.next.take();
            } else if index >= self.length {
                let prev_node = head.get_index_node(0, self.length - 1);
                prev_node.next.take();
            } else {
                let mut prev_node = head.get_index_node(0, index - 1);
                let mut next_node = prev_node.next.take();
                prev_node.next = next_node.as_mut().unwrap().next.take();
            }
        }
    }

鏈表的修改和查詢

  // 修改
    fn change(&mut self, mut index: usize, data: T) {
        if let Some(ref mut head) = self.head {
            if index >= self.length {
                index = self.length;
            }
            let mut node = head.get_index_node(0, index);
            node.data = data;
        }
    }
    //  查詢
    fn search(&mut self, index: usize) -> Option<T> {
        if let Some(ref mut head) = self.head {
            if index >= self.length {
                return None;
            }
            let node = head.get_index_node(0, index);
            let data = node.data;
            return Some(data);
        } else {
            return None;
        }
    }

鏈表打印

impl<T> Display for List<T>
where
    T: Debug,
{
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        if let Some(head) = &self.head {
            let mut head = Some(head);
            while let Some(node) = head {
                write!(f, "{:?} => ", node.data).unwrap();
                head = node.next.as_ref();
            }
        }
        write!(f, "None")
    }
}

代碼地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末竟闪,一起剝皮案震驚了整個(gè)濱河市离福,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炼蛤,老刑警劉巖妖爷,帶你破解...
    沈念sama閱讀 218,386評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異理朋,居然都是意外死亡絮识,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門嗽上,熙熙樓的掌柜王于貴愁眉苦臉地迎上來次舌,“玉大人,你說我怎么就攤上這事兽愤”四睿” “怎么了挪圾?”我有些...
    開封第一講書人閱讀 164,704評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)逐沙。 經(jīng)常有香客問我哲思,道長(zhǎng),這世上最難降的妖魔是什么吩案? 我笑而不...
    開封第一講書人閱讀 58,702評(píng)論 1 294
  • 正文 為了忘掉前任也殖,我火速辦了婚禮,結(jié)果婚禮上务热,老公的妹妹穿的比我還像新娘。我一直安慰自己己儒,他們只是感情好崎岂,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,716評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著闪湾,像睡著了一般冲甘。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上途样,一...
    開封第一講書人閱讀 51,573評(píng)論 1 305
  • 那天江醇,我揣著相機(jī)與錄音,去河邊找鬼何暇。 笑死陶夜,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的裆站。 我是一名探鬼主播条辟,決...
    沈念sama閱讀 40,314評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼宏胯!你這毒婦竟也來了羽嫡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤肩袍,失蹤者是張志新(化名)和其女友劉穎杭棵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體氛赐,經(jīng)...
    沈念sama閱讀 45,680評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡魂爪,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,873評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鹰祸。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片甫窟。...
    茶點(diǎn)故事閱讀 39,991評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖蛙婴,靈堂內(nèi)的尸體忽然破棺而出粗井,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評(píng)論 5 346
  • 正文 年R本政府宣布浇衬,位于F島的核電站懒构,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏耘擂。R本人自食惡果不足惜胆剧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,329評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望醉冤。 院中可真熱鬧秩霍,春花似錦、人聲如沸蚁阳。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)螺捐。三九已至颠悬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間定血,已是汗流浹背赔癌。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留澜沟,地道東北人灾票。 一個(gè)月前我還...
    沈念sama閱讀 48,158評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像茫虽,于是被迫代替她去往敵國(guó)和親铝条。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,941評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • 本文內(nèi)容目錄如下席噩,會(huì)分拆為兩篇筆記班缰,另一則筆記是 "數(shù)組和鏈表結(jié)構(gòu)(python)_1"。 3. 鏈表結(jié)構(gòu) Lin...
    import_hello閱讀 1,654評(píng)論 1 3
  • 用C寫一個(gè)鏈表 鏈表(Linked List)是一種非連續(xù)的線性數(shù)據(jù)結(jié)構(gòu)悼枢,相對(duì)于數(shù)組埠忘,它允許數(shù)據(jù)在內(nèi)存中非連續(xù)存儲(chǔ)...
    xuzhougeng閱讀 756評(píng)論 0 2
  • 搞懂單鏈表常見面試題 Hello 繼上次的 搞懂基本排序算法,這個(gè)一星期馒索,我總結(jié)了莹妒,我所學(xué)習(xí)和思考的單鏈表基礎(chǔ)知識(shí)...
    醒著的碼者閱讀 4,588評(píng)論 1 45
  • 1. 逆序打印鏈表(單鏈表) 給定單鏈表,從尾到頭打印每個(gè)節(jié)點(diǎn)的值绰上,不同的值之間用空格隔開旨怠。比如:1>2>3>4>...
    少冰三hun甜閱讀 3,990評(píng)論 1 12
  • 數(shù)據(jù)結(jié)構(gòu) - 鏈表 鏈表(linked list):由一組被稱為結(jié)點(diǎn)(也叫節(jié)點(diǎn))的數(shù)據(jù)元素組成的數(shù)據(jù)結(jié)構(gòu),每個(gè)結(jié)點(diǎn)...
    惑也閱讀 6,095評(píng)論 0 3