Chinaunix首页 | 论坛 | 博客
  • 博客访问: 79243
  • 博文数量: 22
  • 博客积分: 1250
  • 博客等级: 中尉
  • 技术积分: 305
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-19 09:44
文章分类

全部博文(22)

文章存档

2009年(2)

2008年(20)

我的朋友

分类:

2008-08-29 10:26:26

在网上闲逛,看到有一道题目如下:
    n个人围成一圈,每人有一个各不相同的编号,选择一个人作为起点,然后顺时针从1到k数数,每数到k的人退出圈子,圈子缩小,然后从下一个人继续从1到k数数,重复上面过程。求最后推出圈子的那个人原来的编号。
     这就是经典的约瑟夫环问题啊,所以,用java链表写了个。shy
     首先,创建一个链接节点类  LinkedNode.java

  1. /** 
  2.  * @author    李国庆 
  3.  * @company   leo (C) copyright 
  4.  * @time      2007-4-12  下午04:29:10 
  5.  * @version   1.0.0.0 
  6.  * @package   com.leo.node 
  7.  * @project   nodeDemo 
  8.  */  
  9. package com.leo.node;  
  10.   
  11. /** 
  12.  * @author leo 
  13.  *  
  14.  */  
  15. public class LinkedNode {  
  16.   
  17.   public LinkedNode previous;// 前一节点  
  18.   
  19.   public LinkedNode next;// 后一节点  
  20.     
  21.   public int no; //节点序号  
  22.   
  23.   public Object object;// 节点中的数据  
  24.   
  25.   public LinkedNode(Object object, LinkedNode next,  
  26.       LinkedNode previous) {  
  27.     this.object = object;  
  28.     this.next = next;  
  29.     this.previous = previous;  
  30.   }  
  31.   
  32.   /** 
  33.    * 从链表中移去 
  34.    * 
  35.    */  
  36.   public void remove() {  
  37.     previous.next = next;  
  38.     next.previous = previous;  
  39.   }  
  40.   
  41.   public String toString() {  
  42.     return object.toString();  
  43.   }  
  44.   
  45. }  


   然后 创建环形链表类:LinkedList.java
  1. /** 
  2.  * @author    李国庆 
  3.  * @company   leo (C) copyright 
  4.  * @time      2007-4-12  下午04:14:14 
  5.  * @version   1.0.0.0 
  6.  * @package   com.leo.note 
  7.  * @project   noteDemo 
  8.  */  
  9. package com.leo.node;  
  10.   
  11. /** 
  12.  * @author leo 
  13.  *  
  14.  * 链表集合 
  15.  *  
  16.  */  
  17. public class LinkedList {  
  18.   
  19.   private LinkedNode head;  
  20.   
  21.   public LinkedList() {  
  22.     head.next = head.previous = new LinkedNode("head"nullnull);// 头节点  
  23.   }  
  24.   
  25.   public LinkedList(LinkedNode _head) {  
  26.     head = _head;// 头节点  
  27.     head.next = head.previous = head;  
  28.   }  
  29.   
  30.   /** 
  31.    * 返回头节点 
  32.    * 
  33.    * @return 
  34.    */  
  35.   public LinkedNode getFirst() {// 返回头节点后的第一个节点  
  36.     // LinkedNode node = head.next;  
  37.     // if (node == head) {  
  38.     // return null;  
  39.     // }  
  40.     // return node;  
  41.     return head;  
  42.   }  
  43.   
  44.   /** 
  45.    * 返回最后一个节点 
  46.    * 
  47.    * @return 
  48.    */  
  49.   public LinkedNode getLast() {  
  50.     LinkedNode node = head.previous;  
  51.     if (node == head) {  
  52.       return null;  
  53.     }  
  54.     return node;  
  55.   }  
  56.   
  57.   /** 
  58.    *  将节点加到头节点后 
  59.    * 
  60.    * @param node 
  61.    * @return 
  62.    */  
  63.   public LinkedNode addFirst(LinkedNode node) {  
  64.     node.next = head.next;  
  65.     node.previous = head;  
  66.     node.previous.next = node;  
  67.     node.next.previous = node;  
  68.     return node;  
  69.   }  
  70.   
  71.   /** 
  72.    *  将节点加到头节点后 
  73.    * 
  74.    * @param object 
  75.    * @return 
  76.    */  
  77.   public LinkedNode addFirst(Object object) {  
  78.     LinkedNode node = new LinkedNode(object, head.next, head);  
  79.     node.previous.next = node;  
  80.     node.next.previous = node;  
  81.     return node;  
  82.   }  
  83.   
  84.   /** 
  85.    *  节点添加到链表最后 
  86.    * 
  87.    * @param object 
  88.    * @return 
  89.    */  
  90.   public LinkedNode addLast(Object object) {  
  91.     LinkedNode node = new LinkedNode(object, head, head.previous);  
  92.     node.previous.next = node;  
  93.     node.next.previous = node;  
  94.     // head.previous = node;  
  95.     return node;  
  96.   }  
  97.   
  98.   /** 
  99.    *  清空列表 
  100.    * 
  101.    */  
  102.   public void clear() {// 清空链表  
  103.     // Remove all references in the list.  
  104.     LinkedNode node = getLast();  
  105.     while (node != null) {  
  106.       node.remove();  
  107.       node = getLast();  
  108.     }  
  109.     // Re-initialize.  
  110.     head.next = head.previous = head;  
  111.   }  
  112.   
  113.   /** 
  114.    *  返回对象值 
  115.    */  
  116.   public String toString() {  
  117.     LinkedNode node = head;  
  118.     StringBuffer buf = new StringBuffer();  
  119.     while (node != head) {  
  120.       System.out.println("node.toString() in toString is :"  
  121.           + node.toString());  
  122.       buf.append(node.toString()).append(", ");  
  123.       node = node.next;  
  124.     }  
  125.     return buf.toString();  
  126.   }  
  127.   
  128.   /** 
  129.    * 返回链表的长度 
  130.    *  
  131.    * @return 
  132.    */  
  133.   public int getLength() {  
  134.     int _length = 0;  
  135.     while (head.next != head)  
  136.       _length++;  
  137.     return _length;  
  138.   }  
  139.   
  140. }  

  最后一个测试类  Josephus.java
  1. /** 
  2.  * @author    李国庆 
  3.  * @company   leo (C) copyright 
  4.  * @time      2007-4-12  下午04:34:21 
  5.  * @version   1.0.0.0 
  6.  * @package   com.leo.node 
  7.  * @project   nodeDemo 
  8.  */  
  9. package com.leo.node;  
  10.   
  11. /** 
  12.  * @author leo 
  13.  *  
  14.  */  
  15. public class Josephus {  
  16.   
  17.   public LinkedList _list = null;  
  18.   
  19.   public int start = 0;  
  20.   
  21.   public Josephus(int start) {  
  22.     this.start = start;  
  23.   }  
  24.   
  25.   /** 
  26.    * 移除一个子节点 
  27.    * 
  28.    * @param node 
  29.    */  
  30.   public void removeOneNode(LinkedNode node) {  
  31.     node.remove();  
  32.   }  
  33.   
  34.   /** 
  35.    * 执行踢出 
  36.    * 
  37.    * @param limit 
  38.    */  
  39.   public void doLogic(int limit) {  
  40.     LinkedNode _node_next_frist = _list.getFirst();  
  41.     while (limit > 1) {  
  42.       LinkedNode _node_remove = null;  
  43.       for (int i = 1; i < start; i++) {  
  44.         if (i == 1) {  
  45.           _node_remove = _node_next_frist.next;  
  46.         } else {  
  47.           _node_remove = _node_remove.next;  
  48.         }  
  49.       }  
  50.       _node_next_frist = _node_remove.next;  
  51.       System.out.println(String.valueOf(_node_remove.object)  
  52.           + " is removed!");  
  53.       removeOneNode(_node_remove);  
  54.       limit--;  
  55.     }  
  56.     System.out.println(String.valueOf(_node_next_frist.object)  
  57.         + " is the last element!");  
  58.   }  
  59.   
  60.   /** 
  61.    *  
  62.    *  
  63.    * @param person 
  64.    */  
  65.   public void addNode(String person) {  
  66.     _list.addLast(person);  
  67.   }  
  68.   
  69.   /** 
  70.    * 添加到链表 
  71.    *  
  72.    * @param person 
  73.    */  
  74.   public void addNode(String[] person) {  
  75.     _list = new LinkedList(new LinkedNode(person[0], nullnull));  
  76.     for (int i = 1; i < person.length; i++)  
  77.       _list.addLast(person[i]);  
  78.   }  
  79.   
  80.   /** 
  81.    *  
  82.    * @param args 
  83.    */  
  84.   public static void main(String[] args) {  
  85.     // TODO Auto-generated method stub  
  86.       
  87.     int _persion = 4;//被踢出人的位置  
  88.     String[] _personList = { "老二""张三""李四""王五""赵六",  
  89.         "钱七""孙八""刘九""周十""老大" };//所有人的列队  
  90.       
  91.     Josephus jp = new Josephus(_persion);  
  92.     jp.addNode(_personList);// 添加数组到链表中  
  93.     jp.doLogic(_personList.length);// 执行算法  
  94.   }  
  95. }  


ok,输出结果如下:

王五 is removed!
刘九 is removed!
张三 is removed!
孙八 is removed!
李四 is removed!
老大 is removed!
周十 is removed!
老二 is removed!
钱七 is removed!
赵六 is the last element!
阅读(1893) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~