雙向迴圈連結串列(關於123456輸出456123問題的改進)
阿新 • • 發佈:2021-01-21
雙向迴圈連結串列的例項
關於123456輸出456123的改進:
在第一篇部落格中,使用了陣列的方法,在過程中,通過建立一箇中間變數來覆蓋每個陣列位置的值,來達到資料的更新,但這種大的變動在使用中,會很繁瑣,每輸出一種形式就需要重新改變資料,而這很明顯是一個輸出的問題,而不應該改變資料本身的值。
因此在迴圈連結串列中可以很好的解決這種問題。迴圈連結串列中,,每個結點的資料不需要改變,而通過讓改變標記第一個輸出資料的位置,即可完成按一定順序輸出。
程式碼如下:
連結串列初始化,使得26個英文字母存入連結串列,並使得最後一結點連向頭結點的下一結點,成為雙向迴圈連結串列。
DNode root;
//輸入3實現DEFGHLMJKLMNOPQRSTUVWXYZABC的輸出
//輸入-3實現XYZABCDEFGHLMJKLMNOPQRSTUVW的輸出
public void test_init(){
root =new DNode();
//初始化為雙向迴圈連結串列,頭結點的pre指向尾結點
root.setData(null);
root.next=root;
root.pre=root;
char word='A';
for(int i=0; i<=25;i++){
DNode dNode=new DNode(word++);
dNode.next=root;
dNode.pre=root.pre;
root.pre.next=dNode;
root.pre=dNode;
System.out.print(dNode.getData()+",");
}
root.pre.next=root.next;
root.next.pre= root.pre;
}
輸出模組:
當輸入正數時,表示從第n+1個結點開始輸出,
當輸入負數時,表示從第倒數n個結點開始輸出,
如 3 ,DEFG…ABC
-3 ,XYZABC…
定義兩個指標,指向需要輸出的位置,一個用來標記第一個輸出的位置,另一個指標來指向當前輸出結點。
public void test_print(int n){
int i=0;
DNode pnode=new DNode();
//pnode1指向輸出位置
DNode pnode1=new DNode();
pnode.next=root.next;
if(n>=0){
while(i<n){
pnode.next=pnode.next.next;
i++;
}
pnode1.next=pnode.next;
while (pnode.next.next!=pnode1.next){
System.out.print(pnode.next.getData()+",");
pnode.next=pnode.next.next;
}
System.out.print(pnode.next.getData());
}
if(n<0){
while(i>n){
pnode.next=pnode.next.pre;
i--;
}
pnode1.next=pnode.next;
while (pnode.next.next!=pnode1.next){
System.out.print(pnode.next.getData()+",");
pnode.next=pnode.next.next;
}
System.out.print(pnode.next.getData());
}
}
執行結果如下: