鏈接點的結構:
┌────┬────┬────────┐
│數據│下壹個│上壹個│
└────┴────┴────────┘
雙向鏈表不壹定是雙向鏈表(保存對最後壹個鏈接點的引用),插入時雙向鏈表是雙向的。
有兩條鏈:壹條從頭到尾,壹條從頭到尾,刪除遍歷時也是雙向的。
/**
*雙向鏈表
*/
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();
}
}