當前位置:成語大全網 - 漢語詞典 - 如何在Java中實現雙向鏈表

如何在Java中實現雙向鏈表

雙向鏈表:即雙向指針,即雙向鏈域。

鏈接點的結構:

┌────┬────┬────────┐

│數據│下壹個│上壹個│

└────┴────┴────────┘

雙向鏈表不壹定是雙向鏈表(保存對最後壹個鏈接點的引用),插入時雙向鏈表是雙向的。

有兩條鏈:壹條從頭到尾,壹條從頭到尾,刪除遍歷時也是雙向的。

/**

*雙向鏈表

*/

public class double linked list & lt;t & gt{

私有鏈接& ltt & gt頭;//第壹個節點

私有鏈接& ltt & gt後方;//尾部指針

public doublelinkedlist(){ }

public T peekHead() {

如果(頭!= null) {

返回head.data

}

返回null

}

public boolean isEmpty() {

return head = = null

}

public void insert first(tdata){//插入鏈頭。

鏈接& ltt & gtnewLink =新鏈接& ltt & gt(數據);

如果(isEmpty()) {//為空,則第1次插入的新節點為尾節點。

rear = newLink

}否則{

head.previous = newLink//舊頭節點的上層節點等於新節點。

}

newLink.next = head//新節點和舊頭節點的下級節點

head = newLink//賦值後,頭節點的下壹個節點是舊頭節點,上壹個節點為空。

}

Public void insertLast(T data) {//在鏈的末尾插入。

鏈接& ltt & gtnewLink =新鏈接& ltt & gt(數據);

if (isEmpty()) {

head = newLink

}否則{

rear.next = newLink

}

newLink.previous = rear

rear = newLink//賦值後,尾節點的上層節點為舊尾節點,下層節點為空。

}

Public T deleteHead() {//刪除鏈頭。

if (isEmpty())返回null

鏈接& ltt & gttemp = head

head = head.next//將第壹個節點更改為下壹個節點。

如果(頭!= null) {

head.previous = null

}否則{

後方=空;

}

返回temp.data

}

Public T deleteRear() {//刪除鏈的結尾。

if (isEmpty())返回null

鏈接& ltt & gttemp =後部;

後方=後方.先前;//將尾節點更改為前壹個節點。

如果(後方!= null) {

rear.next = null

}否則{

head = null

}

返回temp.data

}

Public T find(T t) {//從頭到尾查找。

if (isEmpty()) {

返回null

}

鏈接& ltt & gt找=頭;

而(找!= null) {

如果(!find.data.equals(t)) {

find = find.next

}否則{

打破;

}

}

if (find == null) {

返回null

}

返回find.data

}

公共T刪除(T t) {

if (isEmpty()) {

返回null

}

鏈接& ltt & gt電流=水頭;

而(!current.data.equals(t)) {

current = current.next

if (current == null) {

返回null

}

}

if (current == head) {

head = head.next

如果(頭!= null) {

head.previous = null

}

} else if (current == rear) {

後方=後方.先前;

如果(後方!= null) {

rear.next = null

}

}否則{

//中間非終結節點,移除當前。

current . next . previous = current . previous;

current . previous . next = current . next;

}

返回current.data

}

Public boolean inserter (tkey,tdata){//插入在key之後,key沒有返回false。

if (isEmpty()) {

返回false

}

鏈接& ltt & gt電流=水頭;

而(!current.data.equals(key)) {

current = current.next

if (current == null) {

返回false

}

}

鏈接& ltt & gtnewLink =新鏈接& ltt & gt(數據);

if (current == rear) {

rear = newLink

}否則{

new link . next = current . next;

current . next . previous = new link;

}

current.next = newLink

newLink.previous = current

返回true

}

Public Void顯示列表4 Head(){//從頭開始遍歷。

system . out . println(" List(first-& gt;最後):));

鏈接& ltt & gt電流=水頭;

而(當前!= null) {

current . display link();

current = current.next

}

}

Public void顯示列表4 rear(){//從末尾開始遍歷。

system . out . println(" List(last-& gt;第壹):);

鏈接& ltt & gt當前=後方;

而(當前!= null) {

current . display link();

current = current.previous

}

}

類鏈接& ltt & gt{//鏈接點

測試數據;//數據字段

鏈接& ltt & gt接下來;//後繼指針,節點鏈域

鏈接& ltt & gt以前的;//前驅指針,節點鏈域

鏈接(測試數據){

this.data = data

}

void displayLink() {

System.out.println("數據是"+data . tostring());

}

}

公共靜態void main(String[] args) {

DoublyLinkedList & lt整數& gtlist = new DoublyLinkedList & lt整數& gt();

list . insert last(1);

list . insert first(2);

list . insert last(3);

list . insert first(4);

list . insert last(5);

list . display list 4 head();

integer delete head = list . delete head();

system . out . println(" delete head:"+delete head);

list . display list 4 head();

integer delete rear = list . delete rear();

system . out . println(" delete rear:"+delete rear);

list . display list 4 read();

system . out . println(" find:"+list . find(6));

system . out . println(" find:"+list . find(3));

System.out.println("刪除查找:"+list . delete(6));

System.out.println("刪除查找:"+list . delete(1));

list . display list 4 head();

系統。out.println ("-insert-"在指定key之後);

list.insertAfter(2,8);

list.insertAfter(2,9);

list.insertAfter(9,10);

list . display list 4 head();

}

}