1.
「鍊錶」表明這種資料結構是一種鏈式儲存結構
,它不同於線性表的順序儲存結構。鍊錶的相鄰元素
在物理記憶體中不連續
,所以這種結構可以充分利用一些系統的記憶體碎片來完成一些事務,即如果採用鍊錶結構有時可以解決當連續記憶體分配不足時的問題。
鍊錶支援插入和刪除這兩種操作,並且
刪除/插入鍊錶頭部/尾部結點的時間複雜度通常都是常數級別的,鍊錶的
不足在於不支援高效的random access(隨機訪問)。常用於組織刪除、檢索較少,而新增、遍歷較多的資料。
2.
鍊錶和陣列的區別:
(1)陣列在記憶體中是逐個存放的,而鍊錶的相鄰元素
在物理記憶體中不連續,呈現一種隨機的狀態;
(2)陣列一旦顯式的被申明後,其大小就固定了,不能動態進行擴充,而鍊錶則可以;
(3)鍊錶靈活,但是空間和
時間額外耗費較大
;陣列大小固定,元素位置固定,但是操作不靈活,且容易浪費空間,但是時間耗費較小。雙向鍊錶比單向的更靈活,但是空間耗費也更大。
(4)從記憶體儲存來看,(靜態
)陣列從棧中分配空間,鍊錶從堆中分配空間
, 自由度大但是申請管理比較麻煩
3.刪除結點:
當需要刪除乙個節點p時,只需要將p的前乙個節點的next賦為p->next,但是由於是單向的,只知道p,無法知道p前乙個節點,所以需要轉換思路。將p下乙個的節點覆蓋到p節點即可,這樣就等效於將p刪除了。
void deletenode(node*p)
4.鍊錶逆置:
包括head
一共要維護
3個指標,
p是原煉表中
head
的下乙個,
temp
是原煉表中
head
的上乙個。
鍊錶中間結點(不知鍊錶長度):
用快慢指標,快的移動
2個位置,慢的移動
1個位置,快的到最後乙個結點,慢的就到中間
找倒數第
k個結點(不知鍊錶長度):
用slow和fast指標標記,fast指標事先走k步,然後slow和fast同時走,當fast到達末節點時,slow在fast的前k個節點,即為倒數第k個節點。
7.
反向遍歷鍊錶:
鍊錶排序:
第一種方法:轉為陣列,用
sort
後再賦值給鍊錶結點
第二種方法:借助
multimap
的自動排序功能
第三種方法:歸併排序
的非遞迴實現:
鍊錶相交問題:
方法一:如果兩個鍊錶相交,其形狀必為y形,而不可以能為x形,即兩條鍊錶必有相同的尾節點。首先,計算得到兩個鍊錶的長度:m,n,求得兩個鍊錶長度之差distance=|m-n|,讓較長得那個鍊錶事先走distance步,這樣,若是鍊錶相交得話,二者指標必相撞,相撞點即為相交點。
方法二:同時走,走完自己的走另一條,沒有交點則都會走m+n,若有交點,則會在交點處相遇。
鍊錶環問題:
傳送門
資料結構基礎 鍊錶
typedef struct node node typedef struct node linklist 思路 獲取第i個資料 1.宣告乙個指標p指向鍊錶的第乙個結點,初始化j從1開始 2.當jgeteelm linklist l,int i,elemtype e if p j i e p dat...
資料結構基礎 四 鍊錶
鍊錶是一種物理儲存單元上非連續 非順序的儲存結構。資料元素的邏輯順序是通過鍊錶中的指標鏈結次序實現的。與陣列對應,陣列是 是一種物理儲存單元上連續 順序的儲存結構。資料元素的邏輯順序是通過下標次序實現的。鍊錶又分為單向鍊錶 雙向鍊錶。單向鍊錶 每個資料結點中只有乙個指標,指向後繼節點。雙向鍊錶 每個...
資料結構基礎 鍊錶練習
例題6 4 破損的鍵盤 鍊錶 include include const int maxn 100000 5 int last,cur,next maxn 游標位於cur號字母的後面 char s maxn int main for int i next 0 i 0 i next i printf ...