資料結構系列之鍊錶

2021-09-19 07:03:02 字數 3610 閱讀 3881

鍊錶是一種線性的資料結構型別,由一系列的節點組成。每個節點由儲存資料的資料域跟指向下乙個節點的指標域構成。鍊錶又有分單向鍊錶,雙向鍊錶,迴圈鍊錶等。

單向鍊錶

單向鍊錶的結構示意圖就跟上圖結構一樣,只能單向遍歷,最開始的稱之為頭節點,最後乙個稱之為尾節點。遍歷或者查詢順序只能是從頭節點向尾節點方向依次訪問每乙個節點,直到找到需要的那個節點或者位置。這也是單向鍊錶的一點不足。下面用**簡單實現。

開始的是鍊錶的節點類。每個節點包含資料域跟指標域。

public class mylinkedlist 

public int getsize()

/*** 在鍊錶尾部新增節點

** @param data

*/public void insertattail(string data) else

node.next = newnode;

}size++;

}/**

* 在鍊錶頭部新增節點

** @param data

*/public void insertathead(string data)

/*** 指定位置增加節點

** @param data

* @param index 要大於0

*/public boolean insertatposition(string data, int index)

node newnode = new node(data);

node prenode = headnode;

node curnode = headnode;

int curindex = 1;

while (curnode != null)

prenode = curnode;

curnode = curnode.next;

curindex++;

}return false;

}/**

* 刪除頭節點

*/public boolean deletehead()

node node = headnode;

if (node.next != null) else

}/**

* 刪除指定位置的節點

** @param index

*/public boolean delete(int index)

node prenode = headnode;

node curnode = headnode;

int curindex = 1;

while (curnode != null)

prenode = curnode;

curnode = curnode.next;

curindex++;

}return false;

}/**

* 輸出節點內容。

*/public void out()

log.d("xx", "outputlinkedlist: " + "----------這是一條嚴謹的分割線--------");

}

雙向鍊錶雙向鍊錶的每個節點都有,資料域,前驅指標域,後繼指標域,指標分別指向前乙個節點跟後乙個節點,看示意圖:

除去頭節點的前驅指標指向null跟尾節點的後繼指標指向null外,所有的節點的前驅指標跟後繼指標都指向前乙個節點或後乙個節點。即可以從頭節點開始操作鍊錶,也可以從尾節點開始操作鍊錶。跟單向列表對比,如果是操作尾節點或者更加靠近尾節點時操作鍊錶,不需要又從頭節點開始查詢直到尾節點,而是倒序從尾節點開始操作鍊錶了。下面簡單實現一下雙向鍊錶。

public class duplexinglinkedlist 

}private node headnode; //頭節點

private node tailnode; //雙向鍊錶需要比單向鍊錶多出乙個尾節點來

private int size; // 鍊錶容量大小

public duplexinglinkedlist()

/*** 頭插法

** @param data

*/public void insertathead(string data) else

size++;

}/**

* 尾插法

** @param data

*/public void insertattail(string data) else

size++;

}/**

* @param data

* @param index 這裡定義以1開始,要大於0。

* @return

*/public boolean insertatposition(string data, int index)

if (index == 1) else if (index == size) else

c = c.pre;

curindex--;}}

return false;

}/**

* 刪除頭節點

** @return

*/public boolean deletehead()

if (headnode.next != null) else

return true;

}/**

* 刪除尾節點

** @return

*/public boolean deletetail()

if (tailnode.pre != null) else

return true;

}/**

* 刪除指定位置節點

** @param index

* @return

*/public boolean delete(int index)

if (index == 1) else if (index == size) else

c = c.pre;

curindex--;}}

return false;

}/**

* 順序遍歷

*/public void out()

log.d("xx", "outputlinkedlist: " + "---------這是一條嚴謹的分割線---------");

}/**

* 倒序遍歷

*/public void outforafter()

log.d("xx", "outputlinkedlist: " + "----------這是一條嚴謹的分割線--------");}}

總得來說,鍊錶有特殊的指標域指向前乙個節點或者後乙個節點,會使得增刪操作效率更加高效。可以對比陣列,不需要重複地移動其餘的元素,只需要改變將指向節點的指標就可以了。同樣的,鍊錶沒有索引使得查詢效率低些。無論如何查詢,都要從頭節點或者尾節點依次查詢。

資料結構系列二之線性鍊錶

線性鍊錶包含單向鍊錶 雙向鍊錶和迴圈鍊錶。對比線性陣列,鍊錶在更新操作時比線性陣列的時間複雜度要低很多,所以 根據不同的需求選擇不同的資料結構很關鍵。線性表特性 線性陣列在記憶體中連續存放 查詢快 固定大小不適合動態更新資料 線性鍊錶通過指標互連 插入 刪除快 動態分配空間 鍊錶簡單示例圖 單向鍊錶...

資料結構系列之鍊錶 迴圈鍊錶(約瑟夫環)

已知n個人,編號1到n,圍坐在一張圓桌周圍,從k開始報數,數到m的人出列,下乙個人又從k開始報數,到m出列,直至全出列。步驟 1.建立乙個有n個鏈節點無頭節點的迴圈鍊錶 2.確定第乙個報數人位置 3.不斷從鏈中刪除節點至鍊錶為空 n為總人數,k為第乙個報數人,m為出列者喊的數 linklist p,...

資料結構 表之煉表

頭插法建立 尾插法建立 顯示 銷毀 include include using namespace std typedef int elemtype typedef struct lnode linklist void createlinklistf linklist l,elemtype a,in...