在實現了單向鍊錶後,我們在使用單向鍊錶中會發現乙個問題:在單向鍊錶中查詢某乙個結點的下乙個結點的時間複雜度是o(1),但是查詢這個結點的上乙個結點的時候,時間複雜度的最大值就變成了o(n),因為在查詢這個指定結點的上乙個結點時又需要從頭開始遍歷。
那麼該如何解決這個困難呢?我們可以在單鏈表的每個結點中,再設定乙個指向前驅結點的指標域,這就構成了雙向鍊錶。在雙向鍊錶中含有兩個指標域,乙個指向直接前驅,乙個指向直接後繼。
雙向鍊錶是單向鍊錶的拓展,所以程式大致與與單向鍊錶的程式相似。
這裡需要注意的是結點的插入和刪除步驟:
將結點s插入到結點p和p->next之間時
(1)將s前驅指向結點p,如圖中①
(2)將s的後繼指向結點p->next,如圖中②
(3)將p->next的前驅指向結點s,如圖中③
(4)將p的後繼指向結點s,如圖中④
將結點p刪除
(1)將p->prior結點的後驅指標指向p->next結點
(2)將p->next結點的前驅指標指向p->prior結點
(3)解除p結點和其前驅後繼的關係
上**
package likend;
/** * created by yxf on 2018/4/5.
* 雙向鍊錶
*/public
class
doublelink
public
node(t data, node prev, node next)
}public
doublelink()
/*** 在尾部新增
**@param element
*@return
*/public
boolean
add(t element)
/*** 獲取指定索引處的元素
**@param index
*@return
*/public t getelement(int index)
/*** 獲取指定位置的結點
**@param index
*@return
*/public node getnodebyindex(int index)
return currentnode;
}/**
* 獲取指定位置前驅的結點
**@param index
*@return
*/public node getnodebyindexbefore(int index)
return prenode;
}/**
* 獲取指定元素的前驅
**@param currentelem
*@return
*/public t priorelement(t currentelem) else }}
/*** 獲取指定元素的後驅
**@param currentelem
*@return
*/public t nextelement(t currentelem) else }}
//查詢鍊錶中指定元素所在的位置
public
intgetindex(t element)
return -1;
}/**
* 在頭部插入
**@param element
*@return
*/public
boolean
addfirst(t element)
/*** 在指定位置插入元素
**@param index
*@param element
*@return
*/public
boolean
insert(int index, t element)
return
true;
}/**
* 刪除元素
**@param index
*@return
*/public t delete(int index) else
//刪除的是尾結點
if (index == size - 1) else
currentnode.prev = null;
currentnode.next = null;
}size--;
return (t) currentnode.data;
}//刪除最後乙個元素
public t remove()
/*** 尾部插入
**@param e
*/private
void
linklast(t e) else
size++;
}/**
* 在頭部插入
**@param e
*/private
void
linkfirst(t e) else
size++;
}public
boolean
isempty()
//清空線性表
public
void
clear()
@override
public string tostring() }}
測試**
package likend;
/** * created by yxf on 2018/4/5.
*/public
class
doublelinktest
}
新增元素後的鍊錶為: [1->2->4->5]
在鍊錶位置2插入元素: [1->2->3->4->5]
在鍊錶位置2刪除元素: [1->2->4->5]
刪除鍊錶中的乙個元素: [1->2->4]
獲得鍊錶位置為2處的元素: 4
獲取元素2的前驅元素: 1
獲取元素2的後驅元素: 4
process finished with exit code 0
借鑑 **有所改變。 資料結構四雙向鍊錶
雙向鍊錶也叫雙鏈表,是鍊錶的一種,它的每個資料結點中都有兩個指標,分別指向直接後繼和直接前驅。所以,從雙向鍊錶中的任意乙個結點開始,都可以很方便地訪問它的前驅結點和後繼結點。而之前的單鏈表為單向鍊錶,雙向鍊錶也就是在單鏈表的結點中增加乙個指向其前驅的pre指標。如圖 這裡介紹雙向鍊錶的常用操作 l ...
資料結構 003雙向鍊錶
雙鏈表 include using namespace std typedef int elemtype typedef struct lnode lnode,linklist 初始化 linklist init linklist 頭插法建立鍊錶 linklist head insert linkl...
資料結構與演算法筆記(四 雙向鍊錶
前一篇 資料結構與演算法筆記 三 單鏈表 乙個完整的雙向鍊錶應該是頭結點的pre指標指為空,尾結點的next指標指向空,其餘結點前後相鏈。結點構成 建構函式 typedef struct lineline,a 分別表示該結點的前驅 pre 後繼 next 以及當前資料 data 建立 對於建立雙向鍊...