Java數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)之雙向鏈表

雙向鏈表的儲(chǔ)存結(jié)構(gòu)示意圖

雙向鏈表的初始化結(jié)構(gòu)
1.雙向鏈表的結(jié)點(diǎn)

代碼實(shí)現(xiàn)
//雙向鏈表的結(jié)點(diǎn),包含一個(gè)數(shù)據(jù)域,兩個(gè)指針域
typedef struct DoublyNode {
ElementType date; //數(shù)據(jù)域
struct DoublyNode* prev; //指向前綴結(jié)點(diǎn)
struct DoublyNode* next; //指向后綴結(jié)點(diǎn)
}DoublyNode;
2.雙向鏈表的頭結(jié)點(diǎn)

//雙向鏈表
typedef struct DoublyLinkList {
int length;
DoublyNode* next;
};
3.總代碼
//雙向鏈表的結(jié)點(diǎn),包含一個(gè)數(shù)據(jù)域,兩個(gè)指針域
typedef struct DoublyNode {
ElementType date; //數(shù)據(jù)域
struct DoublyNode* prev; //指向前綴結(jié)點(diǎn)
struct DoublyNode* next; //指向后綴結(jié)點(diǎn)
}DoublyNode;
//雙向鏈表
typedef struct DoublyLinkList {
int length;
DoublyNode* next;
};
雙向鏈表中的指定文件插入元素?
1.插入的為第一個(gè)位置


代碼實(shí)現(xiàn)

2.其他位置插入

代碼實(shí)現(xiàn)

總代碼
void InsertDoublyLinkList(DoublyLinkList* dlist, int pos, ElementType element) {
//創(chuàng)建空節(jié)點(diǎn)
DoublyNode* node = (DoublyLinkList*)malloc(sizeof(DoublyLinkList));
node->date = element;
node->prev = NULL;
node->next = NULL;
//在第一個(gè)位置插入結(jié)點(diǎn)
if (pos == 1) {
node->next = dlist->next;
dlist->next = node;
node->next->prev = node;
dlist->length++;
return;
}
DoublyLinkList* currNode = dlist->next;
for (int i = 1; currNode && i < pos - 1; i++) {
currNode = currNode->next;
}
if (currNode) {
node->prev = currNode;
if (currNode->next) {
//如果前置結(jié)點(diǎn)非空->因?yàn)榭站捅硎緵]有后繼結(jié)點(diǎn)了
//將插入位置的前置結(jié)點(diǎn)改為指向新結(jié)點(diǎn)
currNode->next->prev = node;
}
node->next = currNode->next;
currNode->next = node;
dlist->length++;
}
}
雙向鏈表的刪除
1.刪除第一個(gè)元素


代碼實(shí)現(xiàn)

2.刪除其他位置元素


代碼實(shí)現(xiàn)

總代碼
void DeleteDoublyLinkList(DoublyLinkList* dlist, int pos) {
if (pos == 1) {
DoublyLinkList* node = dlist->next;
if (node) {
dlist->next;
if (node->next) {
//如果喲有第二個(gè)結(jié)點(diǎn),那么設(shè)置第二個(gè)結(jié)點(diǎn)的前置結(jié)點(diǎn)為NULL
node->next->prev = NULL;
}
free(node);
dlist->length--;
}
return;
}
DoublyLinkList* node = dlist->next;
for (int i = 1; i < pos; i++) {
node = node->next;
}
if (node) {
if (node->next) {
node->next->prev = node->prve;
}
node->prev->next = node->next;
free(node);
dlist->length--;
}
return;
}
到此這篇關(guān)于Java數(shù)據(jù)結(jié)構(gòu)與算法學(xué)習(xí)之雙向鏈表的文章就介紹到這了,更多相關(guān)Java數(shù)據(jù)結(jié)構(gòu) 雙向鏈表內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java中List集合對(duì)象去重及按屬性去重的8種方法
這篇文章主要介紹了Java中List集合對(duì)象去重及按屬性去重的8種方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一地的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09
JAVA面試題 從源碼角度分析StringBuffer和StringBuilder的區(qū)別
這篇文章主要介紹了JAVA面試題 從源碼角度分析StringBuffer和StringBuilder的區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,下面我們來一起學(xué)習(xí)下吧2019-07-07
mybatis-plus?Wrapper條件構(gòu)造器updateForSet更新方式
這篇文章主要介紹了mybatis-plus?Wrapper條件構(gòu)造器updateForSet更新方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-03-03
Java多線程編程中易混淆的3個(gè)關(guān)鍵字總結(jié)
這篇文章主要介紹了Java多線程編程中易混淆的3個(gè)關(guān)鍵字總結(jié),本文總結(jié)了、volatile、ThreadLocal、synchronized等3個(gè)關(guān)鍵字,對(duì)這幾個(gè)容易混淆概念的關(guān)鍵字分別做了講解,需要的朋友可以參考下2015-03-03
IDEA 顯示Run Dashboard窗口的2種方式(推薦)
這篇文章主要介紹了IDEA 顯示Run Dashboard窗口的2種方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
java 中mongodb的各種操作查詢的實(shí)例詳解
這篇文章主要介紹了java 中mongodb的各種操作查詢的實(shí)例詳解的相關(guān)資料,希望通過本文能幫助到大家,需要的朋友可以參考下2017-09-09

