【數據結構】——單鏈表練習(1)

一、移除鏈表元素

題目鏈接:

移除鏈表元素

那么根據題目的要求我們大致明白這道題要做什么,就是將一個鏈表中,和指定的值相等的元素的節點刪除,然后返回刪除后的新的鏈表,然后題目給我們傳入的參數是鏈表的頭節點和指定的元素。

解法一:

這里其實很多人學習了前面的單鏈表的實現的話,是很容易想到的,我們前面學習了,鏈表刪除指定節點的方法,還有查找指定元素的位置。剛剛好在這道題搭配使用,我們可以使用一個函數,將在這個函數中將這兩個函數調用,然后直到我們查找指定元素位置的函數返回值為空的時候,那么就說明這個鏈表中等于這個指定數據的節點已經刪除完了,那么就可以返回最新的鏈表了,如果不為空,那么我們就先進行刪除,然后再遞歸這個函數。

但是我們這么操作,就很容易造成堆棧,然后導致棧溢出,所以我們解這道題就不使用這個方法。

解法二:

在這道題中,其是要求返回新的鏈表的頭節點,并沒有要求在原來的鏈表上進行刪除,那么我們可以創建一個新的鏈表,然后遍歷原鏈表,不相等的元素,那么我們就進行尾插,不過要注意的是,這個新的鏈表在初始的時候,我們第一次進行尾插,那么此時要讓我們表示新鏈表的指針指向這個節點,然后那個往下走的指針也是,也要指向這個節點,然后在后續的尾插就讓另外一個指針進行變化即可,然后完成后,就返回這個頭節點即可。

我們提交看看:

我們通過測試用例來分析:

我們發現輸出的結果中,還是有最后一個6,那么這是為啥呢?

當pur走到最后一個節點的時候,那么此時,val不符合if的條件,那么其直接就走到了

pur=pur->next這個語句,然后循環結束,那么我們的新鏈表,再最后的5打印后,其實其5這個節點中,其指向下一節點的指針,還是指向著6這個節點,那么我們這個鏈表還是會包括6這個節點,所以我們在遍歷完后,一定要對尾節點指向下一個節點的指針置為空。

?那么我們對尾節點置空,又導致另外一個錯誤了,那就是當我們的原鏈表為空的時候,那么我們就對一個空指針進行解引用了,所以我們要使用一個if判斷當前的尾指針是否為空,如果不為空,那么我們才進行置空操作。

如下:

?可以看到我們這樣修改就通過了。

二、合并兩個有序鏈表?

題目鏈接:合并兩個有序鏈表

這個題目和我們上一篇中的合并兩個有序數組有點類似,這道題目就是其有兩個鏈表,然后兩個鏈表的元素都是按照升序的情況排序的,然后我們現在要將其合并到一個鏈表中,且這個新的鏈表也要為升序的情況。

我們前面在數組的情況下是使用兩個指針來完成的,那么這道題我們該如何解決呢?

那么這個題目沒有說不可以創建一個新的鏈表,那么我們可以創建一個新的鏈表,然后創建兩個指針,一個是src1指向第一個鏈表,一個src2指向第二個鏈表,然后對其每個節點進行遍歷且比較,小的就尾插到新的鏈表中。那么我們循環的條件是啥呢?

就是當其中一個鏈表已經遍歷完,其元素已經全部尾插到新的鏈表中的時候,那么此時的比較就可以結束了,然后剩下的沒尾插完的鏈表,我們再插入即可,但是我們此時就不在需要使用循環插入了,我們只需要指向其下一個節點即可。這樣就可以找到其剩余的節點了,而且尾節點也是指向空的。

方法如下:

提交看看:

?可以看到當鏈表1為空,鏈表2不為空的時候,那么此時就會出錯,那么我們的鏈表1為空,那么就直接到最后兩個if了,那么第一個if進不去,就到第二個了,然后此時的newlist就為空,那么我們此時是對一個空指針進行解引用了,那么就使得程序錯誤了。同理當鏈表2為空,鏈表1不為空也會出現這種錯誤。

所以這兩種情況我們要特殊處理。

?不過我們會發現上面的代碼會有很多重復進行的操作,那么我們有沒有上面辦法可以使得上面的代碼變得簡潔一些呢?

我們發現上面很多重復的動作都是因為一個特殊情況,就是鏈表為空的情況導致的。

那么我們可以在開始就創建一個鏈表,但是這個鏈表申請的時候是不存儲東西的,其頭節點是一個空的節點,那么我們就不在需要考慮鏈表為空的情況了,可以直接在這個鏈表進行為尾插的操作了,然后在最后我們將這個鏈表的頭節點的下一個節點返回即可。

不過這個空節點,是我們使用函數malloc申請的,那么我們在使用完后,要記得釋放掉,不然會造成空間的浪費,我們在釋放前就將其下一個節點先保存起來即可。

優化后:

三、反轉鏈表?

題目鏈接:反裝鏈表

?題目的要求就是要我們將一個鏈表反過來,就是其走的方向和原來的反過來,頭節點變為尾節點,尾節點變成頭節點

解法一:

我們很容易就可以想到的是,我們創建一個新的鏈表,然后我們遍歷原鏈表,然后將原鏈表的數據頭插到新的鏈表即可。

代碼如下:

?解法二:

解法二就是使用指針的方法,在原鏈表上進行操作,就直接對鏈表的指向進行修改。那么我們要如何進行修改呢?

我們創建三個指針n1,n2,n3,一個指向空,一個指向鏈表的頭節點,一個指向鏈表頭節點的下一個節點。

然后我們就讓這個頭節點的指向下一個節點的指針指向n1,也就是n2->next=n1,然后三個指針都往后走一個節點的位置,即n1=n2,n2=n3,n3=n3->next;那么我們再畫圖就可以知道,此時的n1是在頭節點的位置了,然后我們再讓n2->next=n1,那么就使得我們第二個節點指向下一個節點的指針指向的是頭節點了,那么此時是第二個節點指向第一個節點了,然后我們反復這樣操作,指到n2走到尾節點,然后再對這個尾節點進行修改,然后再走一步,那么此時n2就為空了,那么就不在需要修改了。那么此時就結束循環即可。

不過我們看到上面題目的測試用例,會發現有個是空表,因為我們知道我們對于一個空指針進行解引用是錯誤的,那么為了避免這種錯誤,我們對于傳入的是空鏈表的情況特殊處理一下。

那么走到最后,我們要返回的是新的鏈表的頭節點,那么此時n2是在新的頭節點的后面一個位置了,然后n1是在n2的前一個節點的位置的,那么此時n1的位置剛剛好就是反轉后的鏈表的頭節點。

還有就是,我們的循環條件是n2到空的時候,那么n3早就已經為空了,那么我們此時就不可以再對其解引用了,所以我們使用一個if進行處理。

代碼如下:

?四、鏈表的中間節點

題目鏈接:鏈表的中間節點

解法一:?

題目的描述也很簡單,就是有一個鏈表,讓我們找他中間的位置。然后如果是偶數個的節點,那么其中間節點就是兩個,那么我們取后面的一個。

那么我們很快就可以想到一個思路:

就是先讓這個鏈表進行遍歷,然后我們創建一個整型變量,記錄其遍歷的次數,那么就是這個鏈表的節點數,然后我們將這個節點數除2,那么就是我們的中間節點了。

比如:當前鏈表為三個節點,那么除二,就是1.5,然后我們是整型數據,那么其結果其實是1,那么就往下走一次就是中間的節點了,現在為4個節點,那么我們走兩次就到第三個節點,就是題目要求的那個節點了。

代碼如下:

?

解法二:

我們可以創建兩個指針,一個快指針,一個慢指針,我們要找的是中間節點,那么我們的慢指針就一次走兩步,慢指針就一次走一步,那么等到快指針走到尾的時候,那么就可以結束了,那么此時慢指針的位置就在鏈表的中間節點了,不過我們要注意的是。那么我們的循環條件就是當快指針走到尾的時候就結束循環,但是我們會發現,當鏈表的節點數為偶數的時候,那么此時我們的快指針是最后走到尾節點的時候,還會再往下走一步的,那么我們的快指針此時就為空了,那么此時就要停止循環了。然后奇數個的時候,那么此時我們的快指針就剛剛好在尾節點上,那么此時我們也應該結束循環了,那么此時我們循環結束的條件可以為->next,此時其下一個節點為空,剛剛好可以結束循環。

代碼如下:

?五、判斷鏈表是不是回文結構

題目鏈接:鏈表回文結構

前面我們對于數組,字符串,都有學習過回文結構,也實現過判斷其是否為回文結構,所以這里我們不過多介紹回文結構。

下面我們來解題

解法一:

我們如果先不理題目的要求,那么我們很快可以想到的是,遍歷鏈表,將鏈表的數據存儲到一個普通的數組中,然后就可以使用我們前面的方法進行判斷了。

但是我們的題目要求我們的空間復雜度為O(1),那么我們如果這樣做的話,空間復雜度就為O(n)了,就不符合題目的要求了,但是我們再看題目的后面,其鏈表的長度小于等于900,那么我們一次給夠900個空間,那么空間復雜度不就是O(1)了嗎。

代碼如下:

我們知道上面的題目,其給出了這個鏈表的最大的長度,那么我們的空間直接給最大,那么其空間復雜度就直接為O(1)了,那么如果其并沒有給出這個情況的話,那么我們這么操作是達不到要求的。那么我們下面看一個可以達到要求的解法。?

解法二:

我們鏈表不能直接進行比較就是因為我們的鏈表是無法通過當前節點找到前面的節點,只能找到下一個節點,不能和數組那么直接通過下標這樣進行比較。

不過我們發現回文結構的話,我們從中間位置開始,往兩邊走,其都是一樣的,那么我們上面有道題不就是尋找鏈表的中間節點嗎,但是我們該如何從中間節點往前訪問呢?只能說中間節點是頭節點才可以進行遍歷了呀。哎,我們上上道題就是將鏈表進行反轉,那么我們可以在中間節點這個位置,將后面的部分進行反轉,然后再和前面的節點進行比較,不就剛剛好嗎。

代碼如下:

?

?

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

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

相關文章

AI大模型基礎設施:主流的幾款開源AI大語言模型的本地部署成本

以下是對目前主流開源AI大語言模型(如DeepSeek R1、LLaMA系列、Qwen等)本地部署成本的詳細分析,涵蓋計算機硬件、顯卡等成本,價格以美元計算。成本估算基于模型參數規模、硬件需求(GPU、CPU、RAM、存儲等)以…

AI生成視頻檢測方法及其相關研究

目錄標題 【1】AI-Generated Video Detection via Spatio-Temporal Anomaly Learning【2】DeCoF: Generated Video Detection via Frame Consistency【2.1】Spatiotemporal Convolutional Neural Networks (STCNN) rely on spatial artifacts【2.2】Capturing Universal Spatia…

仿騰訊會議——服務器注釋

目錄 1、修改協議 2、修改登錄請求結構體 3、修改登錄回復結構體 4、修改注冊請求結構體 5、修改發送登錄請求函數 6、實現發送注冊請求函數 7、修改mysql存儲數據格式 8、自己完成部分 1、修改協議 2、修改登錄請求結構體 3、修改登錄回復結構體 4、修改注冊請求結構體…

list的迭代器詳講

1.list的迭代器就是封裝了節點指針的類 2.迭代器失效 迭代器失效即迭代器封裝的節點指針無效 。因為 list 的底層結構為帶頭結點的雙向循環鏈表 ,因此 在 list 中進行插入時是不會導致 list 的迭代 器失效的,只有在刪除時才會失效,并且失效的…

deepSeek論文寫作提示詞指令大全(覆蓋選題、寫作、潤色到投稿全流程)

一、選題與框架設計 1、跨學科選題突破 指令:"結合[領域A]與[領域B]的前沿理論,生成5個交叉創新性論文選題,要求每個選題包含可行性評估。"(支持跨學科研究創新) 示例:"在人工智能與教育心理學領域生成選題,分析理論適用性與資源獲取難度。" 2、…

win11安裝WSL(創建用戶、更改或重置密碼)

文章目錄 win11安裝WSL設置 Linux 用戶名和密碼更改或重置密碼更新和升級軟件包WSL 命令互操作性WSL 的基本命令安裝列出可用的 Linux 發行版列出已安裝的 Linux 發行版將 WSL 版本設置為 1 或 2設置默認 WSL 版本設置默認 Linux 發行版將目錄更改為主頁通過 PowerShell 或 CMD…

Vue.js 與 Ajax (vue-resource) 的深入解析

Vue.js 與 Ajax (vue-resource) 的深入解析 引言 在Web開發中,前后端的交互是不可或缺的。Ajax(異步JavaScript和XML)技術允許我們在不重新加載整個頁面的情況下,與服務器交換數據和更新部分網頁內容。Vue.js 作為一種流行的前端框架,提供了多種方式來處理Ajax請求。其中…

第十三章-PHP MySQL擴展

第十三章-PHP與MySQL 一&#xff0c;連接數據庫 1. 使用 MySQLi&#xff08;面向對象方式&#xff09; <?php // 數據庫參數 $host localhost; $username root; $password ; $database test_db;// 創建連接 $conn new mysqli($host, $username, $password, $databa…

【文獻閱讀】全球干旱地區植被突變的普遍性和驅動因素

一、研究背景 全球干旱區&#xff08;drylands&#xff09;覆蓋了陸地面積的40%以上&#xff0c;承載了全球約三分之一人口&#xff0c;是生態系統脆弱性較高的區域。這些地區對氣候變化和人類干擾尤其敏感。近年來&#xff0c;干旱區發生了大量植被突變現象&#xff0c;即生態…

【Vue3-Bug】中路由加載頁面直接顯示空白

Vue3中路由加載頁面直接顯示空白 沒有子路由 路由定義不能重復&#xff0c;請自己查看數據在main.js(或者)mina.ts入口文件中&#xff0c;需要將router的注入到vue中的執行放在&#xff0c;vue掛在元素之前 // 順序不能變 app.use(router) app.mount(#app)在App.vue中 // 在…

影樓精修-露齒笑算法解析

注意&#xff0c;為避免侵權&#xff0c;本文圖片均為AIGC生成或網絡公開數據&#xff1b; 像素蛋糕-露齒笑 在介紹本文之前&#xff0c;先說一下&#xff0c;其實露齒笑特效&#xff0c;并非像素蛋糕首創&#xff0c;早在幾年前&#xff0c;face app就率先推出了這個效果&am…

關于Python:7. Python數據庫操作

一、sqlite3&#xff08;輕量級本地數據庫&#xff09; sqlite3 是 Python 內置的模塊&#xff0c;用于操作 SQLite 數據庫。 SQLite 是一個輕量級、零配置的關系型數據庫系統&#xff0c;整個數據庫保存在一個文件中&#xff0c;適合小型項目和本地存儲。 SQLite 不需要安裝…

c++互斥鎖,競爭狀態與臨界區

競爭狀態與臨界區 1&#xff0c;基本互斥鎖2&#xff0c;try_lock3&#xff0c;互斥鎖存在的坑—線程搶占不到資源4&#xff0c;超時鎖5&#xff0c;遞歸鎖&#xff08;在一個線程內可以多次lock的鎖&#xff09;recursive_mutex和recursive_timed_mutex用于業務組合6&#xff…

實戰項目:基于控制臺與數據庫的圖書管理系統開發指南

一、項目概述與設計思路 1.1 為什么選擇圖書管理系統 圖書管理系統是學習編程的經典項目&#xff0c;它涵蓋了&#xff1a; 控制臺交互&#xff1a;學習用戶輸入輸出處理 數據庫操作&#xff1a;掌握CRUD核心功能 業務邏輯&#xff1a;理解實際應用場景 系統架構&#xff…

人工智能——層次聚類算法

目錄 摘要 18 層次聚類 18.1 本章工作任務 18.2 本章技能目標 18.3 本章簡介 18.4 編程實戰 18.5 本章總結 18.6 本章作業 本章已完結&#xff01;&#xff01;&#xff01; 摘要 本章實現的工作是&#xff1a;首先導入20名學生的3科成績&#xff0c;然后根據優先聚…

Linux中安裝mysql8,轉載及注意事項

一、先前往官網下載mysql8 下載地址&#xff1a; https://dev.mysql.com/downloads/選擇Linux 二、刪除Linux中的mysql&#xff08;如果有的話&#xff09;&#xff0c;上傳安裝包 1、先查看mysql是否存在&#xff0c;命令如下&#xff1a; rpm -qa|grep -i mysql如果使用這…

《算法導論(第4版)》閱讀筆記:p4-p5

《算法導論(第4版)》學習第 3 天&#xff0c;p4-p5 總結&#xff0c;總計 2 頁。 一、技術總結 1.instance Thus, given the input sequence h31; 41; 59; 26; 41; 58i, a correct sorting algorithm returns as output the sequence h26; 31; 41; 41; 58; 59i. Such an inp…

第十四篇:系統分析師第三遍——15章

目錄 一、目標二、計劃三、完成情況四、意外之喜(最少2點)1.計劃內的明確認知和思想的提升標志2.計劃外的具體事情提升內容和標志 五、總結六、后面準備怎么做&#xff1f; 一、目標 通過參加考試&#xff0c;訓練學習能力&#xff0c;而非單純以拿證為目的。 1.在復習過程中&…

Easy云盤總結篇-登錄注冊

**說在前面&#xff1a;該項目是跟著B站一位大佬寫的&#xff0c;不分享源碼&#xff0c;支持項目付費 ** 獲取圖形驗證碼 可以看到這里有2兩種圖形驗證碼&#xff0c;分為&#xff1a; type0&#xff1a;如上圖下面那個&#xff0c;是完成操作后要進行注冊的驗證碼 type1: 如…

【前端知識】Vue3狀態組件Pinia詳細介紹

Vue3狀態組件Pinia詳細介紹 關聯知識 Pinia 組件介紹、核心原理及使用方式 Pinia 組件介紹 Pinia 是 Vue.js 的官方狀態管理庫&#xff0c;專為 Vue 3 設計&#xff0c;提供簡潔的 API 和強大的 TypeScript 支持。其核心組件包括&#xff1a; ? Store&#xff1a;狀態存儲容器…