雙向鍊錶中每個節點保留兩個引用prev和next,讓prev指向當前節點的上乙個節點,讓next指向當前節點的下乙個節點,此時的鍊錶既可以向後一次訪問每個節點,也可以依次訪問每個節點,也可以向前一次訪問每個節點。
操作:①查詢:即可從頭結點開始搜尋,也可以從尾節點開始搜尋,取決於被搜尋的節點是更靠近header還是更靠近tail,用index②插入:插入乙個節點必須同時修改兩個方向的節點。
③刪除:刪除乙個節點也需要同時修改兩個方向的節點
因為雙向鍊錶需要維護兩個方向的指標,因此程式在新增節點、刪除節點都比維護普通單鏈表更複雜。
乙個雙向鍊錶的實現如下:
package com.xuan.datastructs;
public class dulinklist
//初始化全部屬性的構造器
public node(t data,node prev,node next)
} //儲存該鍊錶的頭節點
private node header;
//儲存該鍊錶的尾節點
private node tail;
//儲存該鍊錶中已經包含的節點數
private int size;
//建立空鍊錶
public dulinklist()
//以指定資料元素來建立鍊錶,該鍊錶只有乙個元素
public dulinklist(t element)
//返回鍊錶的長度
public int length()
//獲取鏈式線性表中索引為index處的元素
public t get(int index)
//根據索引index獲取指定位置的節點
private node getnodebyindex(int index)
if(index<=size/2)
}}else
}} return null;
} //查詢鏈式線性表中指定元素的索引
public int locate(t element)
//如果還是空鍊錶
if(header==null)elseelse
} }//採用尾插法為鍊錶新增新節點
public void add(t element)else
size++;
} //採用頭插法為鍊錶新增新節點
public void addatheader(t element)
size++;
} //刪除鏈式線性表中指定索引處的元素,返回刪除節點處的元素
public t delete(int index)
node del=null;
//如果被刪除的是header節點
if(index==0)else
//將被刪除節點的prev、next引用賦為null
del.prev=null;
del.next=null;
} size--;
return del.data; }
//刪除鏈式線性表中最後乙個元素
public t remove()
//判斷鏈式線性表是否為空鍊錶
public boolean empty()
//清空線性表
public void clear()
public string tostring()else
int len=sb.length();
} }public string reversetostring()else
int len=sb.length();
} }//測試
public static void main(string args)
}
演算法2 鍊錶3 雙向鍊錶
雙 向 鍊錶中有兩條方向不同的鏈,即每個結點中除next域存放後繼結點位址外,還增加乙個指向其直接前趨的指標域prior。雙向鍊錶在查詢時更方便 特別是大量資料的遍歷。注意 雙鏈表由頭指標head惟一確定的。帶頭結點的雙鏈表的某些運算變得方便。將頭結點和尾結點鏈結起來,為雙 向 迴圈鍊錶。形式描述 ...
Python3 雙向鍊錶
雙向鍊錶 每乙個元素都是乙個物件,每個物件有乙個關鍵字key和兩個指標 next和prev 在雙向鍊錶的實現中,使用乙個偽頭部 dummy head 和偽尾部 dummy tail 標記界限,這樣在新增節點和刪除節點的時候就不需要檢查相鄰的節點是否存在。class dlinkednode def i...
1 5 雙向鍊錶
實現 public class doublelinkedlistdemo 鍊錶操作類 class doublelinkedlist 新增節點 同單向,但有點區別,加上前乙個指標 public void add heronode2 heronode2 temp.next heronode2 heron...