<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 々上善若水々 閱讀(7499) 評論(1)  編輯  收藏 所屬分類: 數據結構與算法

    評論

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

    請問結點類里this(0)是什么意思?
    謝謝!
    2014-02-13 14:04 | nieschumi
    主站蜘蛛池模板: 黄页网站在线免费观看| 4399影视免费观看高清直播| 亚洲成a人片在线观看日本 | 久久综合给合久久国产免费| 亚洲成a人片在线网站| 国产免费拔擦拔擦8x| 成全在线观看免费观看大全| 亚洲精品精华液一区二区| 亚洲色婷婷一区二区三区| 国国内清清草原免费视频99 | 亚洲国产欧美日韩精品一区二区三区| 亚洲一区二区精品视频| 四虎在线最新永久免费| 午夜在线免费视频| tom影院亚洲国产一区二区| 亚洲熟伦熟女新五十路熟妇 | 国产精品高清全国免费观看| 久久免费观看国产99精品| 美女免费精品高清毛片在线视| 亚洲精品免费在线观看| mm1313亚洲国产精品美女| 青青视频观看免费99| a级男女仿爱免费视频| 国产成人亚洲午夜电影| 亚洲免费网站在线观看| 亚洲av无码专区在线播放| 免费观看国产精品| 免费看国产精品3a黄的视频| 久久久国产精品无码免费专区| 麻豆安全免费网址入口| 亚洲精品日韩一区二区小说| 久久亚洲AV成人出白浆无码国产 | 亚洲国产熟亚洲女视频| 久久久亚洲欧洲日产国码aⅴ| 国产成人毛片亚洲精品| 国产成人免费永久播放视频平台| 97在线线免费观看视频在线观看| 久久一区二区三区免费播放 | 免费国产不卡午夜福在线| 毛片A级毛片免费播放| free哆啪啪免费永久|