單向鍊錶和雙向鍊錶

2022-09-05 19:33:10 字數 2559 閱讀 8636

一、鍊錶是什麼?

單向鍊錶linked list:是一種在物理上非連續、非順序的資料結構,由若干節點(node)所組成。

節點包括兩部分,一部分是存放資料的變數data,另一部分是指向下乙個節點的指標next。

鍊錶的第1個節點被稱為頭節點,最後1個節點被稱為尾節點尾節點的next指標指向空

注意:鍊錶分為帶頭節點的鍊錶 和 沒有頭節點的鍊錶。頭節點不存放資料內容。

陣列是連續儲存的,而鍊錶的各個節點不一定是連續儲存。

陣列能根據下標隨機訪問,而鍊錶只能從頭節點開始通過一級一級的節點去尋找。

陣列在記憶體中的儲存方式是順序儲存,鍊錶在記憶體中的儲存方式則是隨機儲存。

二、單向鍊錶的基本操作

鍊錶在查詢節點在查,煉表不像陣列那樣可以通過下標快速進行定位,只能從頭節點開始向後乙個乙個節點逐一查詢(遍歷)。--輔助指標

//

增加節點

//頭部插入---中間插入---尾部插入

//頭部插入和尾部插入---改變next屬性指向插入節點

//中間插入---使得 插入位置的上乙個元素的節點 指向 插入元素,而插入元素的 next 屬性指向上乙個元素原本的下乙個節點--利用輔助指標

heronode temp = head; //建立--輔助指標

boolean flag = false; //flag標誌新增的編號是否存在,預設false

while(true)

if(temp.next.no > node.no) else if(temp.next.no == node.no)

temp = temp.next; //繼續遍歷洗下乙個元素

}//--迴圈結束

//判斷flag的值

if(flag) else

//

刪除節點--節點無法自我刪除

public void del(int index)

if(index == temp.next.no)

temp = temp.next;

}//判斷是否要刪除節點

if(flag) else

}

//

修改節點

//找到要修改的節點

public void updatenode(heronode node)

if(temp.no == node.no)

temp = temp.next;//遍歷下乙個元素

}//根據flag值判斷是否修改節點

if(flag) else

}三、雙向鍊錶

雙向鍊錶:雙向鍊錶比單向鍊錶稍微複雜一些,它的每乙個節點除了擁有 data 和 next 指標,還擁有指向前置節點的 prev 指標。

管理單向鍊錶的缺點分析:

1). 單向鍊錶,查詢的方向只能是乙個方向,而雙向鍊錶可以向前或者向後查詢

2). 單向鍊錶不能自我刪除,需要靠輔助節點,而雙向鍊錶,則可以自我刪除,所以前面我們單鏈表刪除時節點,總是找到temp,temp是待刪除節點的前乙個節點(認真體會)

雙向鍊錶的操作:

刪除:增加、更新:

修改:

//

雙向鍊錶的查抄--和單向鍊錶相同,不過能雙向

//雙向鍊錶的增加--預設新增到雙向鍊錶的最後

//(1)先找到雙向鍊錶的最後這個節點

//(2)temp.next=newheronode 末尾節點指向插入節點

//(3)newheronode.pre=temp; 插入節點的pre屬性指向上乙個節點

煉表頭節點增加----temp.pre.next=temp.next

temp.next.pre=temp.pre;

單向鍊錶和雙向鍊錶

1.單向鍊錶 單向鍊錶只可向乙個方向遍歷。查詢乙個節點的時候需要從第乙個節點開始每次訪問下乙個節點,一直訪問到需要的位置。也可以提前把乙個節點的位置另外儲存起來,然後直接訪問。2.雙向鍊錶 可以從任何乙個節點訪問前乙個節點,也可以訪問後乙個節點,以至整個鍊錶。一般是在需要大批量的另外儲存資料在鍊錶中...

單向鍊錶和雙向鍊錶區別 雙向鍊錶

一開始確實被這個雙向鍊錶整暈了,node裡面不停套node,簡直無限套娃,讓人不知道該怎麼下手。後來看了資料結構與演算法分析這本書的 才算整明白。我把鍊錶分成了三個部分 第一部分是node.node是乙個由兩根指標,以及我們需要儲存的資料構成的結構體。這個node就是無限套娃的起源,也是鍊錶用於儲存...

鍊錶(單向鍊錶,雙向鍊錶)

首先鍊錶是以節點的方式儲存資料的,每個節點包含資料域 data 節點域 next 鍊錶的每個節點在計算機中儲存的位置是不連續的和隨機的,優點就是資料的插入和刪除比較好,而查詢資料效率不是太好 因為鍊錶無法像靜態資料一樣隨機讀取資料,必須按照順序找到對應的資料為止 單向鍊錶就像是火車,所有的節點串聯成...