揭開鍊錶的真面目

2022-03-10 02:32:34 字數 3268 閱讀 9384

鍊錶是一種常見的資料結構,鍊錶是由一連串的結點組成,這個節點就是鏈結點,每個鏈結點都由資料域指標域兩部分組成。

使用鍊錶結構可以克服陣列結構需要預先知道資料大小的缺點,鍊錶結構可以充分利用計算機記憶體空間,實現靈活的記憶體動態管理。但是鍊錶失去了陣列隨機讀取的優點,同時鍊錶由於增加了結點的指標域,空間開銷比較大。

鍊錶比較好的一種理解是:將鍊錶看成乙個火車,每個車廂之間都是相互連線的,只要找到火車頭,就可以找到具體的車身。鍊錶也是,我們只關心它的頭。

單向鍊錶的乙個鏈結點包含資料域和下乙個鏈結點的指標。頭結點也包含資料域和指標域,但是一般為了方便查詢,頭節點不寫資料,最後乙個結點的指標指向空。

建立乙個鏈結點的實體類

public class node 

}

1.2.1 插入乙個節點

在頭節點後插入乙個結點,第一步需要將新插入的結點指向頭結點指向的結點,第二部將頭結點指向新插入的結點。插入結點只需要改變乙個引用,所以複雜度為o(1)。

}1.2.2 頭結點後刪除乙個結點

在頭結點後刪除乙個結點,就是讓頭結點指向這個結點的下乙個結點。複雜度也是o(1)。

public node deletefirst()
1.2.3 根據資料域查詢結點

查詢需要比對每個結點的資料,理論上查詢乙個結點平均需要n/2次,所以複雜度為o(n)。

public node find(long value)

current = current.next;

}return current;

}

查詢需要比對每個結點的資料,理論上刪除乙個結點平均需要n/2次,所以複雜度為o(n)。

public node delete(int value)

pre = current;

current = current.next;

}if(current == head)else

return current;

}

雙端鍊錶是在單向鍊錶的基礎上,頭結點增加了乙個尾結點的引用。

2.2.1 從頭部插入結點

如果鍊錶為空,則設定尾結點就是新新增的結點。複雜度為o(1)。

public class firstlastlinklist 

node.next = first;

first = node;}}

2.2.2 從尾部插入結點

如果鍊錶為空,則設定頭結點為新新增的結點,否則設定尾結點的後乙個結點為新新增的結點。複雜度為o(1)。

public void insertlast(long value)else

last = node;

}

2.2.3 從頭部進行刪除

判斷頭結點是否有下乙個結點,如果沒有則設定尾結點為null,複雜度為o(1)。

public node deletefirst()

first = tmp.next;

return tmp;

}

每個結點除了儲存對後乙個結點的引用外,還儲存著對前乙個結點的引用。

鏈結點實體類

public class node 

}

3.2.1 從頭部插入結點

如果鍊錶為空,則設定尾結點為新新增的結點,如果不為空,還需要設定頭結點的前乙個結點為新新增的結點。插入結點只需要改變兩個結點的引用,所以複雜度為o(1)。

3.2.2 從尾部插入結點

如果鍊錶為空,則設定頭結點為新新增的結點,否則設定尾結點的後乙個結點為新新增的結點。同時設定新新增的結點的前乙個結點為尾結點。插入結點只需要改變1個結點的引用,所以複雜度為o(1)。

public void insertlast(long value)else

last = node;

}

3.2.3 從頭部刪除結點

判斷頭結點是否有下乙個結點,如果沒有則設定尾結點為null,否則設定頭結點的下乙個結點的prev為null。複雜度也為o(1)。

public node deletefirst()else

first = tmp.next;

return tmp;

}

3.2.4 從尾部刪除結點

如果頭結點後沒有其他結點,則設定頭結點為null,否則設定尾結點的前乙個結點的next為null,設定尾結點為前乙個結點。複雜度為o(1)。

public node deletelast()else

last = last.prev;

return last;

}

鍊錶包含乙個頭結點和多個結點,頭結點包含乙個引用,這個引用通常叫做first,它指向鍊錶的第乙個鏈結點。結點的next為null,則意味著這個結點時尾結點。與陣列相比,鍊錶更適合做插入、刪除操作,而查詢操作的複雜度更高。還有乙個優勢就是鍊錶不需要初始化記憶體大小,不會造成記憶體溢位(陣列中插入元素個數超過陣列長度)或記憶體浪費(宣告的陣列長度比實際放的元素長)。

揭開SEO的真面目

我們為什麼覺得seo難做,道理很直接,也很簡單,第一,我們不懂具體的操縱方法,第二,我們已經知道操作方法,但是沒有能力去完成。做seo無非就是兩個重點,乙個是內容,乙個是鏈結,做好了這點,自然也就保證了 的排名。身為乙個站長,首先程式設計客棧要懂得把握重點,知道先去做什麼,再去做什麼,有乙個主次之分...

揭開AssetBundle廬山真面目 一

1 常用打包api public static bool buildassetbundle object mainasset,object assets,string pathname,out uint crc,buildassetbundleoptions assetbundleoptions,b...

揭開AssetBundle廬山真面目(二)

昨天的分享揭開assetbundle廬山真面目 一 我們主要剖析了4.x版本下的assetbundle管理機制,那5.x版本究竟有些什麼變化呢?今天我們來一 竟。1 唯一api public static assetbundlemanifest buildassetbundles string ou...