循环链表

  1.   图示
    1. 数据结构
    2. 循环链表添加新元素:

      1. 当链表中没有任何元素时候
      2.  当链表中已经存有至少一个元素的时候

    3. 循环链表删除元素

      1.  链表元素>1

      2. 循环链表遍历元素

  2. ADT概要
    1. //链表节点为单链表节点
      private LinkNode currrent;
      //链表内节点个数
      public int nItems;
       // 返回最早插入的元素  
      public LinkNode peek() ;
      //找出指定节点
      public LinkNode find(int value);
      //添加新元素 在当前元素后插入新元素
      public void insert(LinkNode node);
      //删除当前元素的下一个元素
      public LinkNode remove();
      //遍历显示当前循环链表
      public void displayList();

       

    2. /*单链表节点实现的有序循环链表*/
      public class CircleList {
          private LinkNode current;//当前节点的指针
          public int nItems;//链表内节点个数
          public CircleList(){
              current = null;
          }
          public LinkNode peek() { // 返回最早插入的元素  
              // 调用前要判断是否为空  
              return current.next;  
          }  
          public LinkNode find(int value) {  
              LinkNode temp = current; // 保存原来的位置  
              do{
                  if(current.iData == value) return current;
                  stepNext();
              }while(current!=temp);
            
              throw new RuntimeException("不能找到该值 :"+value);
          }
          //添加新元素
          public void insert(LinkNode node){
              if(isEmpty()) {
                  node.next = node;
                  current = node;// 插入元素,current要移动要新元素  
              }else{
                  node.next = current.next;
                   current.next = node;
                   current = node;// 插入元素,current要移动要新元素  
                  
              }
              nItems++;
          } 
          //当前元素无法删除自身 只能删除当前元素的下一个元素
        public LinkNode remove() {  
           // list为空是没有考虑,在调用remove之前应该判断是否为空 
            if(isEmpty()){
                  throw new RuntimeException("链表当前为空 ,不能删除操作");
              }
            LinkNode temp = current.next;// 删掉current的下一个元素  
            if (current.next == current) { // 只有一个元素时  
                current = null;  
            } else {  
                current.next = current.next.next;  
            } 
              nItems--;
              return temp;
          }
       
          public void displayList() {
              if(isEmpty()){
                  throw new RuntimeException("链表当前为空 ,不需要显示");
              }
                  LinkNode temp = current;
                  do {
                      // 从current
                      stepNext();
                      current.displayLink();
                  } while (current != temp);
                  System.out.println();
          }
          
          /*指针移向下一处节点,返回指针指向的最新节点 */
          public LinkNode stepNext(){
              if(isEmpty())
                  throw new RuntimeException
                  ("链表当前为空,指针不能移向下一个节点");
              current = current.next;
              return current;
          }
           public int size() {  
                  return nItems;  
              }  
          public boolean isEmpty(){
              return current== null;
          }
          public static void main(String[] args) {
              LinkNode node1 = new LinkNode(10,10.1);
              LinkNode node2 = new LinkNode(20,20.2);
              LinkNode node3 = new LinkNode(5,5.5);
              CircleList list = new CircleList();
              list.insert(node1);
              list.insert(node2);
              list.insert(node3);
              System.out.println("Before delete");
              list.displayList();
              System.out.println("After delete");
              list.remove();
              list.displayList();
              
              /*int target = list.find(20).iData;
              System.out.println("找到的值为"+target);*/
          }
      }

       

  3.  循环链表的应用: 
    1. 约瑟夫环:有7个人,从1到7,从第一个人开始报数,报到4出圆圈,最后被消去的人的顺序是4,1,6,5,7,3.最后剩下的人是2号.
    2. 1 初始化一个循环链表
      2 循环遍历链表.每循环三个元素.删除下一个元素.
      3 循环结束条件循环链表内只剩下唯一一个元素.
      4 返回该元素
    3. 代码
public class JosephusRing {
        public static LinkNode  getJosephus(int number){
            CircleList circleList=
            new CircleList();
            //Initialise the link list
        for (int i=1;i<=number;i++){
            LinkNode node =
                    new LinkNode(i,i+0.1);
            circleList.insert(node);
        }
        System.out.println("原始的圈子:");
        circleList.displayList();
        System.out.println("出圈子的顺序 :");
 
        while(circleList.nItems!=1){
            System.out.println("圈子中的人数 :"+circleList.nItems );
            for(int j=1;j<4;j++)
                circleList.stepNext();
            System.out.print(circleList.remove().iData + " ");
        }
        System.out.println();
        return circleList.peek();    
        }
        public static void main(String[] args) {
            LinkNode number = 
                    JosephusRing.getJosephus(7);
            System.out.println("Josephus的编号是 :"+ number.iData);
        }
}

 

 

                         

posted @ 2013-06-25 14:37  王超_cc  阅读(981)  评论(0编辑  收藏  举报