網(wǎng)站首頁 編程語言 正文
一、順序表
二.鏈表
目錄
?一、順序表
二.鏈表
一.順序表
1.基本概念:是指用一組地址連續(xù)的存儲單元依次存儲數(shù)據(jù)元素的線性結(jié)構(gòu)。我們常見的順序表有數(shù)組。
2.操作方面:可以基本實現(xiàn)數(shù)據(jù)的增刪改查,因為有下標索引,所以查詢工作很方便,效率很高。但是在增加元素和刪除就不是很方便了,因為元素要整體移位置,會比較麻煩,下面的鏈表可以解決這個問題。
3.時間復雜度的對比:如圖所示
二.鏈表
1.鏈表和順序表有所區(qū)別,儲存地址不一定是連續(xù)的。當查詢操作多的時候一般用順序表,刪除和插入多的一般用鏈表,選擇合適的數(shù)據(jù)結(jié)構(gòu)很重要。
2.單鏈表有head頭結(jié)點,后繼結(jié)點,尾結(jié)點指向為null。用指針進行遍歷時,While(p.next!=null)即可。
圖示:
3.head頭結(jié)點的數(shù)據(jù)域可以不存儲任何信息,也可以存儲如線性表的長度等類的附加信息。頭結(jié)點的指針域指向首元結(jié)點。并且頭結(jié)點不計入鏈表的長度。
4.注意:單鏈表只有后繼結(jié)點,可以向后移動,不可以回頭。當結(jié)點在向后移動時,要保存p結(jié)點往后的結(jié)點,可以設置一個臨時q=p.next來保存p的后繼結(jié)點。
5.在插入時,注意順序,如:要求在head和head.next之間插入一個s,代碼如下:
s.next=head.next; ??
head.next=s;(注:兩者順序不能調(diào)換)
6.刪除時,單鏈表與順序表比較很是方便,時間復雜度是O(1),只需將要刪除的結(jié)點的后繼結(jié)點改為待刪除結(jié)點的后繼結(jié)點即可。
在java中刪除的結(jié)點會自動回收,在c語言中要自己釋放刪除的結(jié)點:free(p)。
實現(xiàn)代碼如下:
? ? ? ? ? ? ? ? ?s.next=p.next; (s為待刪除結(jié)點p的前一個結(jié)點)
7.頭插法:倒序排列——可以理解為將其插在head和head.next之間。實現(xiàn)代碼:將數(shù)組元素值傳遞給s結(jié)點,for循環(huán)遍歷
? ? ? ? ? ? ? ? ? s.next=L.head.next;
???????????????????L.head.next=s;
圖示:
注:在實際運用中一般要用一個q來臨時保存s的后繼結(jié)點。
8.尾插法:正序排列——可以理解為一個個按順序插在head后面。實現(xiàn)代碼:將數(shù)組元素值傳遞給s結(jié)點,for循環(huán)遍歷
將t設置為L.head
t.next=s;
????????????t=s;//將t向后移動
圖示:
9.單鏈表例題:
(一)求中位數(shù):
方法一,找到編號(n-1)/2+1位置的結(jié)點即可。其中可以用Math.cell(n/2f)向上取整代替,其中f是為了使其里面變成double類型。
方法二,快慢指針法,快指針一次移動兩個結(jié)點,慢結(jié)點一次移動一個結(jié)點。所有當快指針遍歷完時,慢指針只走了一般,即所指向的位置就是中位數(shù)。
(二)統(tǒng)計最大值個數(shù):
方法一,直觀方法,先找最大值,再遍歷尋找等于最大值的數(shù),統(tǒng)計個數(shù),需要用到兩次while循環(huán)。
方法二,設置p指向首結(jié)點,初始化最大值為首結(jié)點的值,p=p.next不停的向后移動。
思想:當遍歷未結(jié)束時,將后繼的結(jié)點和max比較,比它大設置新的max值,個數(shù)記為1。再次遇到相同的值,個數(shù)再加1……知道遇到比max大的后繼結(jié)點,在設置新的max值,重置個數(shù)為1,依次進行直到結(jié)束。一次while循環(huán)即可。
(三)二路歸并有序表A和B合并為新的升序表C,空間復雜度為O(1),只能結(jié)點重組來建立單鏈表C。
(四)將A和B中的相同元素放入單鏈表C,不改變A和B,只能通過復制來建立單鏈表C。兩者注意區(qū)分。
圖示:
10.雙鏈表:可以理解為高級一些的鏈表,結(jié)點由前端指針域,數(shù)據(jù)域和后端指針域三要素組成。每一個結(jié)點有兩個指向,其中頭結(jié)點的前端指向null,尾結(jié)點后端指向null。
圖示如下:
11.雙鏈表和單鏈表的對比:雙鏈表更加高效,可以實現(xiàn)從前往后,也可以從后往前遍歷;而單鏈表則是比較單一,只能從前往后,只有一個指針,無法找前驅(qū)結(jié)點。
在刪除一個結(jié)點時,雙鏈表不需要找到前驅(qū)結(jié)點,只需要找到刪除的結(jié)點就可以實現(xiàn)刪除操作。 ?
12.循環(huán)鏈表:顧名思義,就是是表中最后一個結(jié)點的指針域指向頭結(jié)點(首節(jié)點和末節(jié)點被連接在一起),整個鏈表形成一個環(huán)。
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖示:
13.循環(huán)鏈表和單鏈表區(qū)別:單鏈表的尾結(jié)點指針指向空地址,表示這就是最后的結(jié)點了。循環(huán)鏈表的尾結(jié)點指針是指向鏈表的頭結(jié)點。
14.循環(huán)鏈表的運用:適用于存儲有循環(huán)特點的數(shù)據(jù),比如約瑟夫問題:由一群元素構(gòu)成的環(huán)形鏈表,首先由某個元素開始報數(shù),報到K時的那個元素需要出圈,然后又由下一個元素開始報數(shù),直到全部的元素出圈時才結(jié)束。
原文鏈接:https://blog.csdn.net/qq_67931344/article/details/126910322
相關推薦
- 2023-04-07 C#中將dateTimePicker初始值設置為空_C#教程
- 2023-11-14 使用python獲取指定進程的CPU/內(nèi)存情況;Python獲取指定進程的CPU和內(nèi)存使用情況
- 2022-11-14 Git暫存區(qū)的意義或git add的意義
- 2022-10-09 React高階組件的使用淺析_React
- 2022-07-26 用3dmax做折扇的思路方法與步驟
- 2022-02-03 checkbox修改默認樣式
- 2022-04-10 Python語言實現(xiàn)科學計算器_python
- 2022-04-12 git項目初次push提示error: failed to push some refs to ht
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支