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)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Map按單個(gè)或多個(gè)Value排序當(dāng)Value相同時(shí)按Key排序
Map可以先按照value進(jìn)行排序,然后按照key進(jìn)行排序。 或者先按照key進(jìn)行排序,然后按照value進(jìn)行排序,這樣操作都行,這篇文章主要介紹了Map按單個(gè)或多個(gè)Value排序,當(dāng)Value相同時(shí)按Key排序,需要的朋友可以參考下2023-02-02
java定時(shí)任務(wù)cron表達(dá)式每周執(zhí)行一次的坑及解決
這篇文章主要介紹了java定時(shí)任務(wù)cron表達(dá)式每周執(zhí)行一次的坑及解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
RSA加密的方式和解密方式實(shí)現(xiàn)方法(推薦)
下面小編就為大家?guī)硪黄猂SA加密的方式和解密方式實(shí)現(xiàn)方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-06-06
Java調(diào)用構(gòu)造函數(shù)和方法及使用詳解
在Java編程中,構(gòu)造函數(shù)用于初始化新創(chuàng)建的對象,而方法則用于執(zhí)行對象的行為,構(gòu)造函數(shù)在使用new關(guān)鍵字創(chuàng)建類實(shí)例時(shí)自動(dòng)調(diào)用,沒有返回類型,并且名稱與類名相同,本文通過示例詳細(xì)介紹了如何在Java中使用構(gòu)造函數(shù)和方法,感興趣的朋友一起看看吧2024-10-10
詳談jpa中表的@OneToMany等關(guān)聯(lián)關(guān)系
這篇文章主要介紹了詳談jpa中表的@OneToMany等關(guān)聯(lián)關(guān)系,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Java計(jì)算兩個(gè)漢字相似度的實(shí)現(xiàn)方法
有時(shí)候我們希望計(jì)算兩個(gè)漢字的相似度,比如文本的 OCR 等場景,用于識(shí)別糾正,本文給大家詳細(xì)介紹了Java計(jì)算兩個(gè)漢字相似度的實(shí)現(xiàn)方法,文中有詳細(xì)的實(shí)現(xiàn)代碼,需要的朋友可以參考下2023-11-11
Java 異常的棧軌跡(Stack Trace)詳解及實(shí)例代碼
這篇文章主要介紹了Java 異常的棧軌跡(Stack Trace)詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-03-03

