雙向鍊錶最大的特點:
每個節點內有兩個資料域(指標),乙個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 ...