1. 程式人生 > 其它 >雙向迴圈連結串列(關於123456輸出456123問題的改進)

雙向迴圈連結串列(關於123456輸出456123問題的改進)

技術標籤:練習演算法連結串列資料結構java

雙向迴圈連結串列的例項

關於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());
        }

    }

執行結果如下:
在這裡插入圖片描述
在這裡插入圖片描述