從零開始養(yǎng)成算法·篇四:雙向鏈表與雙向循環(huán)鏈表

一、雙向鏈表

1、定義:從下圖中的定義結(jié)點的代碼我們能發(fā)現(xiàn),雙向與單向最明顯的區(qū)別就是是否可以反向查找上一結(jié)點。

定義

2、創(chuàng)建:大致和單向的創(chuàng)建差不多,區(qū)別在于多了prior的處理

步驟:

1、*L 指向頭結(jié)點

2、新增數(shù)據(jù):

2.1.創(chuàng)建1個臨時的結(jié)點

2.2.為新增的結(jié)點建立雙向鏈表關(guān)系

① temp 是p的后繼

② temp 的前驅(qū)是p

③ p 要記錄最后的結(jié)點的位置,方便下一次插入

創(chuàng)建新鏈表

3、插入:

步驟:

1. 插入的位置不合法 為0或者為負(fù)數(shù)

2. 新建結(jié)點

3.將p指向頭結(jié)點!

4. 找到插入位置i直接的結(jié)點

5. 如果插入的位置超過鏈表本身的長度

6. 判斷插入位置是否為鏈表尾部

1?? 將p->next 結(jié)點的前驅(qū)prior = temp

2?? 將temp->next 指向原來的p->next

3?? p->next 更新成新創(chuàng)建的temp

4?? 新創(chuàng)建的temp前驅(qū) = p

插入指定位置

4、刪除

1.判斷雙向鏈表是否為空,如果為空則返回0

2. 將指針p移動到刪除元素位置前一個

3.如果k>i 或者 p == NULL 則返回0

4.創(chuàng)建臨時指針delTemp 指向要刪除的結(jié)點,并將要刪除的結(jié)點的data 賦值給*e,帶回到main函數(shù)

5. p->next 等于要刪除的結(jié)點的下一個結(jié)點

6. 如果刪除結(jié)點的下一個結(jié)點不為空,則將將要刪除的下一個結(jié)點的前驅(qū)指針賦值p

7. 刪除delTemp結(jié)點

刪除

二、雙向循環(huán)鏈表

1、創(chuàng)建

步驟:

1、*L 指向頭結(jié)點

2、新增數(shù)據(jù):

2.1.創(chuàng)建1個臨時的結(jié)點

2.2.為新增的結(jié)點建立雙向鏈表關(guān)系

①?temp 是p的后繼

② temp 的前驅(qū)是p

③ temp的后繼是*L

④ p 的前驅(qū)是新建的temp

⑤ p 要記錄最后的結(jié)點的位置,方便下一次插入

初始化或創(chuàng)建

2、插入

步驟:

1. 創(chuàng)建指針p,指向雙向鏈表頭

2.雙向循環(huán)鏈表為空,則返回0

3.找到插入前一個位置上的結(jié)點p

4.如果i>index 則返回0

5.創(chuàng)建新結(jié)點temp

6.temp 結(jié)點為空,則返回error

7.將生成的新結(jié)點temp數(shù)據(jù)域賦值e.

8.將結(jié)點temp 的前驅(qū)結(jié)點為p;

9.temp的后繼結(jié)點指向p->next;

10.p的后繼結(jié)點為新結(jié)點temp;

11.如果temp 結(jié)點不是最后一個結(jié)點,temp節(jié)點的下一個結(jié)點的前驅(qū)為temp 結(jié)點


插入

3、刪除

步驟:

1.如果刪除到只剩下首元結(jié)點了,則直接將*L置空;

2.找到要刪除的結(jié)點

3.給e賦值要刪除結(jié)點的數(shù)據(jù)域

4.修改被刪除結(jié)點的前驅(qū)結(jié)點的后繼指針?

5.修改被刪除結(jié)點的后繼結(jié)點的前驅(qū)指針?

6. 刪除結(jié)點temp

刪除
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容