大話資料結構(四) 雙向鍊錶的java實現

2021-08-18 06:31:32 字數 3230 閱讀 7728

在實現了單向鍊錶後,我們在使用單向鍊錶中會發現乙個問題:在單向鍊錶中查詢某乙個結點的下乙個結點的時間複雜度是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 建立 對於建立雙向鍊...