資料結構 雙向鍊錶

2021-10-01 23:08:40 字數 4489 閱讀 6400

雙向鍊錶最大的特點:

每個節點內有兩個資料域(指標),乙個pre之前該節點的前乙個節點,乙個next指向該節點的下乙個節點(如果為null,則表示該節點為該鍊錶的末端節點)

雙向鍊錶資料類

@slf4j

public

class

doublelinkedlist

heronode2 cur = headnode.next;

/*根據節點編號獲取節點資訊*/

while

(cur != null)

}return null;

}/**

* 遍歷鍊錶

*/public

void

list()

heronode2 cur = headnode.next;

while

(cur != null)

}/**

* 新增節點

** @param addnode

*/public

void

add(heronode2 addnode)

heronode2 cur = headnode;

/*遍歷鍊錶,直到鍊錶末端*/

while

(cur.next != null)

cur.next = addnode;

addnode.pre = cur;

}/**

* 批量新增鍊錶節點

** @param addlist

*/public

void

addlist

(doublelinkedlist addlist)

/*獲取待新增鍊錶的首端元素*/

heronode2 addcur = addlist.headnode.next;

heronode2 cur = headnode.next;

/*找到新增鍊錶的末端元素*/

while

(cur.next != null)

/*將新增鍊錶的末端元素的next指向待新增元素的首端元素*/

cur.next = addcur;

/*將待新增元素首端位置的pre域指向新增元素的末端元素*/

addcur.pre = cur;

}/**

* 按順序新增節點

** @param addnode

*/public

void

addbyorder

(heronode2 addnode)

/*中間變數指向頭節點*/

heronode2 temp = headnode;

/*標誌位,新增的資料編號是否存在,預設不存在*/

boolean flag =

false

;while

(true

)/*如果新增的節點的編號和中間節點next域中的編號相同,證明存在資料重複現象*/

if(temp.next.no == addnode.no)

else

if(temp.next.no > addnode.no)

/*如果以上條件都不存在,說明還未找到新增位置,需將指標下移*/

temp = temp.next;}if

(flag)

已存在,不能重複新增"

, addnode.no)

;return;}

/*找到位置之後,新增節點的next域指向中間節點的next域*/

addnode.next = temp.next;

/*待新增節點的pre域指向當前節點*/

addnode.pre = temp;

/*如不是鍊錶末端,則當前節點next域中的pre指向待新增節點*/

if(temp.next != null)

/*當前節點的next域指向待新增節點*/

temp.next = addnode;

}/**

* 按順序新增乙個鍊錶

* @param addnodes

*/public

void

addlistbyorder

(doublelinkedlist addnodes)

}/**

* 更新鍊錶資訊

** @param updatenode

*/public

void

update

(heronode2 updatenode)

/*如果鍊錶為空,則無可更新的資料資訊*/

if(headnode.next == null)

int updateno = updatenode.no;

/*標誌位,用於標誌鍊錶中是否包含待更新的資料資訊*/

boolean flag =

false

; heronode2 cur = headnode.next;

while

(cur != null)

cur = cur.next;}if

(!flag)

/*更新節點的姓名、暱稱資訊*/

cur.name = updatenode.name;

cur.nickname = updatenode.nickname;

}/**

* 根據資料編號刪除鍊錶資訊

** @param no

*/public

void

deletebyno

(int no)

/*標誌位,用於標誌鍊錶中是否包含待刪除的資料資訊*/

boolean flag =

false

; heronode2 cur = headnode.next;

while

(cur != null)

cur = cur.next;}if

(!flag)

/*則修改當前節點的pre域內節點的next域指向當前節點的next域,當前節點的next域可能為null,也可能有值*/

cur.pre.next = cur.next;

/*如果當前節點的next域存在,則直接將當前節點next域內節點的pre域指向當前節點的pre*/

if(cur.next != null)

}/**

* 獲取鍊錶長度

** @return

*/public

intlength()

return i;

}/**

* 反轉鍊錶(改變資料結果)

*/public

void

reverse()

/*定義乙個中間頭節點*/

heronode2 temphead =

newheronode2(0

,"",""

);/*定義該節點指向當前節點的下乙個節點,中間儲存*/

heronode2 next = null;

/*當前節點*/

heronode2 cur = headnode.next;

while

(cur != null)

/*當前節點的next域指向中間頭節點的next域*/

cur.next = temphead.next;

/*當前節點的pre指向頭節點*/

cur.pre = temphead;

/*頭節點的next指向當前節點,完成當前節點的插入操作*/

temphead.next = cur;

/*cur指向下乙個節點,進行下一次迴圈*/

cur = next;

}/*原鍊錶的頭節點的next域指向中間節點的next域,改變原鍊錶的資料結構*/

headnode.next = temphead.next;

/*中間頭節點的pre域指向中間節點的頭節點,改變原鍊錶的資料結構*/

temphead.pre = headnode;

}/**

* 反轉鍊錶操作(不改變資料結構)

*/public

void

reverseprint()

stack

stack =

newstack

<

>()

; heronode2 cur = headnode.next;

while

(cur != null)

while

(!stack.

isempty()

)}}

資料模型

public

class

heronode2';

}public

heronode2

(int no, string name, string nickname)

}

測試類

public

class

singlelinkedlistdemo

}

資料結構 鍊錶 雙向鍊錶

注意typedef的定義結構,以及dinklist的資料型別 typedef struct dnode dnode,dinklist 注意插入第乙個結點時,prior指標的空指向問題 if l next null 若l後繼結點為空 則省略該步驟 l next prior p 基本 頭插法建立雙向鍊錶...

資料結構 雙向鍊錶

前幾天寫了乙個單向鍊錶,今天參考自己單向鍊錶改寫了乙個雙向非迴圈鍊錶,下面只討論雙向非迴圈鍊錶。雙向非迴圈鍊錶有如下特點 一 雙向鍊錶每個結點都有乙個前驅指標和後驅指標 當然頭結點和尾結點除外 二 雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。三 頭結點只有後驅指標沒有前驅...

資料結構 雙向鍊錶

單鏈表的單向性 只能從頭結點開始高效訪問鍊錶中的資料元素。單鏈表還存在另乙個缺陷 逆序訪問時候的效率極低。如下 linklistlist for int i 0 i 5 i for int i list.length 1 i 0 i 根據大o推算法可以得出乙個for迴圈的時間複雜度為o n get ...