雙向連結清單(雙連結清單)是連結清單的一種。和單連結清單一樣,雙連結清單也是由節點組成,它的每個資料結點中都有兩個指針,分别指向直接後繼和直接前驅。是以,從雙向連結清單中的任意一個結點開始,都可以很友善地通路它的前驅結點和後繼結點。一般我們都構造雙向循環連結清單。
下面代碼中,不是雙向循環連結清單,而是雙向連結清單,但是頭節點和尾節點沒有連接配接起來。
package com.bjsxt.collection;
import java.util.ArrayList;
public class MyLinkedList {
//和以前定義數組一樣
private Node first;
private Node last;
int size=0;//連結清單裡面有幾個節點了
void add(Node e){
final Node l=last;//不能被改變
//如果last不為空
if(last!=null){
//設定e的字首為last的字首
e.setProvide(l);
//設定last的字尾為空
e.setNext(null);
//設定e的字尾為last
last.setNext(e);
last=e;
if(first.next==null){
first.setNext(e);
}
//如果last為空
}else{
first=e;
last=e;
}
size++;
}
//實作周遊功能
void whileLinkedList(){
Node mm=first;
System.out.print("前置節點"+first.provide);
System.out.print("自身節點"+first.self);
System.out.print("後置節點"+first.next.self);
System.out.println("========================");
for(int i=0;i<size-1;i++){
Node x=mm.next;
if(x!=null){
if(x.provide!=null){
System.out.print("前置節點"+x.provide.self);
}
if(x.self!=null){
System.out.print("自身節點"+x.self);
}
if(x.next!=null){
System.out.print("後置節點"+x.next.self);
}
}
if(i==size-2){
System.out.print("後置節點"+null);
}
System.out.println("========================");
mm=x;
}
}
public static void main(String[] args){
MyLinkedList myLinkedList =new MyLinkedList();
for(int i=0;i<200;i++){
myLinkedList.add(new Node(i));
}
System.out.println("現在隊列裡面有"+myLinkedList.size+"節點");
System.out.println("第一個節點"+myLinkedList.first.self);
System.out.println("最後一個節點"+myLinkedList.last.self);
myLinkedList.whileLinkedList();
}
}
//節點,相當于我們集合裡存放的一個個單元
//它本身有三個元素 即前驅 後記 及它本身 為了友善我們将self也定義為String,其實他也可以是Object的任意元素
class Node{
Node provide;
Object self;
Node next;
public Node getProvide() {
return provide;
}
public void setProvide(Node provide) {
this.provide = provide;
}
public Object getSelf() {
return self;
}
public void setSelf(Object self) {
this.self = self;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
}
public Node(Node provide, Object self, Node next) {
super();
this.provide = provide;
this.self = self;
this.next = next;
}
public Node() {
super();
}
public Node(Object self) {
super();
this.self = self;
}
}
輸出結果如下:
現在隊列裡面有12節點
第一個節點0
最後一個節點11
前置節點null自身節點0後置節點1========================
前置節點0自身節點1後置節點2========================
前置節點1自身節點2後置節點3========================
前置節點2自身節點3後置節點4========================
前置節點3自身節點4後置節點5========================
前置節點4自身節點5後置節點6========================
前置節點5自身節點6後置節點7========================
前置節點6自身節點7後置節點8========================
前置節點7自身節點8後置節點9========================
前置節點8自身節點9後置節點10========================
前置節點9自身節點10後置節點11========================
前置節點10自身節點11後置節點null========================
結束語:看起來簡單,做起來難,不要做眼高手低的人
v:18612372242 歡迎交流