<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    我的漫漫程序之旅

    專注于JavaWeb開發
    隨筆 - 39, 文章 - 310, 評論 - 411, 引用 - 0
    數據加載中……

    以單向循環鏈表求解約瑟夫環問題Java版

    約瑟夫環(Josephus)問題:古代某法官要判決n個犯人的死刑,他有一條荒唐的法律,將犯人站成一個圓圈,從第s個人開始數起,每數到第d個犯人,就拉出來處決,然后再數d個,數到的人再處決……直到剩下的最后一個可赦免.
    結點類:OneLinkNode:
    package com;
    /**
     * 結點類
     * 
    @author zdw
     *
     
    */

    public class OneLinkNode
    {
        
    public int data;
        
    public OneLinkNode next;
        
    public OneLinkNode(int k)
        
    {
            data 
    = k;
            next 
    = null;
        }

        
        
    public OneLinkNode()
        
    {
            
    this(0);
        }

    }

    鏈表類:
    OneLink:
    package com;

    public class OneLink
    {
        
    //頭結點
        protected OneLinkNode head;
        
    //構造一個空的單向鏈表
        public OneLink()
        
    {
            head 
    = null;
        }

        
    //只有一個結點的單向鏈表
        public OneLink(OneLinkNode h1)
        
    {
            head 
    = h1;
        }

        
    //判斷鏈表是否為空
        public boolean isEmpty()
        
    {
            
    return head == null;
        }

        
    //用隨機數構造n個數的鏈表
        public OneLink(int n)
        
    {
            OneLinkNode rear,q;
            
    if(n > 0)
            
    {
                
    int k = (int) (Math.random()*100);
                head 
    = new OneLinkNode(k);
                rear 
    = head;
                
    for(int i = 1; i < n ;i++)
                
    {
                    k 
    = (int) (Math.random()*100);
                    q 
    = new OneLinkNode(k);
                    rear.next 
    = q;
                    rear 
    = q;
                }

            }

        }

        
    }

    Josephus類:
    package com;

    public class Josephus2 extends OneLink
    {
        Josephus2() 
    // 構造空的單向循環鏈表
        {
            
    super();
        }


        Josephus2(
    int n) // 建立n個結點的單向循環鏈表
        // 鏈表結點值為1到n
            this();
            
    int i = 1;
            
    //q新結點,rear尾結點
            OneLinkNode q, rear;
            
    if (n > 0)
            
    {
                
    //先創建只有一個結點的單向循環鏈表
                head = new OneLinkNode(i);
                
    //指向自己
                head.next = head;
                rear 
    = head;
                
    while (i < n)
                
    {
                    i
    ++;
                    
    //新結點
                    q = new OneLinkNode(i);
                    
    //新結點的next字段指向head
                    q.next = head;
                    
    //這里的near是尾結點(第一次就是head)的next字段指向新結點
                    rear.next = q;
                    
    //保存新節點的地址,以便下次循環使用
                    rear = q;
                }

            }

        }

        
    //計數起點s,d要跳過的個數
        public void display(int s, int d) // 解約瑟夫環
        {
            
    int j = 0;
            OneLinkNode p 
    = head;
            
    while (j < s - 1// 指針步進到計數起始點
            {
                j
    ++;
                p 
    = p.next;
            }

            
    while (p.next != p) // 多于一個結點時循環
            {
                j 
    = 0;
                
    while (j < d ) // 計數
                {
                    j
    ++;
                    p 
    = p.next;
                }

                delete(p); 
    // 刪除p的后繼結點
                p = p.next;
                
    this.output();
            }

        }


        
    public void delete(OneLinkNode p) // 刪除p的后繼結點
        {
            OneLinkNode q 
    = p.next; // q是p的后繼結點
            System.out.print("delete:  " + q.data + "  ");
            
    if (q == head) // 欲刪除head指向結點時,
                head = q.next; // 要將head向后移動
            p.next = q.next; // 刪除q
        }


        
    public void output() // 輸出單向鏈表的各個結點值
        {
            OneLinkNode p 
    = head;
            System.out.print(
    this.getClass().getName() + ":  ");
            
    do
            
    {
                System.out.print(p.data 
    + " -> ");
                p 
    = p.next;
            }
     while (p != head);
            System.out.println();
        }

        
    //測試
        public static void main(String args[])
        
    {
            
    int n = 5, s = 2, d = 1;
            Josephus2 h1 
    = new Josephus2(n);
            h1.output();
            h1.display(s, d);
        }



    }

    測試輸出結果沒有任何問題:
    com.Josephus2:  1 -> 2 -> 3 -> 4 -> 5 -> 
    delete:  
    4  com.Josephus2:  1 -> 2 -> 3 -> 5 -> 
    delete:  
    2  com.Josephus2:  1 -> 3 -> 5 -> 
    delete:  
    1  com.Josephus2:  3 -> 5 -> 
    delete:  
    3  com.Josephus2:  5 -> 



    posted on 2007-12-31 09:59 々上善若水々 閱讀(7507) 評論(1)  編輯  收藏 所屬分類: 數據結構與算法

    評論

    # re: 以單向循環鏈表求解約瑟夫環問題Java版  回復  更多評論   

    請問結點類里this(0)是什么意思?
    謝謝!
    2014-02-13 14:04 | nieschumi
    主站蜘蛛池模板: 亚洲欧美在线x视频| 日本亚洲色大成网站www久久| 日韩成人毛片高清视频免费看| 18禁无遮挡无码网站免费| 亚洲一级毛片免费看| 久久亚洲国产成人精品性色| 亚洲入口无毒网址你懂的| 曰批视频免费40分钟试看天天| 亚洲成人在线电影| 久久国产色AV免费观看| 亚洲视频手机在线| 欧美a级成人网站免费| 亚洲一久久久久久久久| 国产在线a不卡免费视频| 67pao强力打造67194在线午夜亚洲| 午夜无码A级毛片免费视频| 亚洲视频欧洲视频| 成人一a毛片免费视频| 精品亚洲成a人在线观看| 爱情岛论坛网亚洲品质自拍| 国产在线观a免费观看| 亚洲黄色免费网址| 四虎www免费人成| 国产美女视频免费观看的网站 | 免费无码一区二区| 亚洲熟女乱综合一区二区 | 2021国产精品成人免费视频| 学生妹亚洲一区二区| 亚洲精品视频免费| 午夜免费啪视频在线观看| 最新国产精品亚洲| 亚洲最大av无码网址| 国内精品免费麻豆网站91麻豆| 无码天堂亚洲国产AV| 国产亚洲人成网站观看| 无码日韩人妻av一区免费| 国产国产人免费人成成免视频| 亚洲精品在线电影| 亚洲av中文无码| 免费一级毛suv好看的国产网站 | 免费观看黄色的网站|