基于循环双链表的一道编程题(java实现)

来源:互联网 发布:nba季后赛各项数据统计 编辑:程序博客网 时间:2024/05/20 18:53


题目如下:

n个人(第一个人序号为1,第二个为2第三个人为n)围成一圈从第一个人开始从13一次循环报数,报到3的人出列,下一个人开始从1重新开始报数,求最后留下的人的序号。(20分)

举例:5个人围成一圈,一次编号为一,二,三,四,五。从一号开始报数,一号报1,二号报2,三号报3,三号出列。圈中剩一,二,四,五,四号从1重新开始报数,四号报1,五号报2,一号报3,一号出列,以此类推。

源代码:

package com.xz.java02;

import java.util.ArrayList;
//定义一个接口              //其实没必要,只是为了复习一下接口知识
 interface List{
 //创建一个循环链表的方法
  void print();
  int Length();
}
class MyNode{
 public int value;
 public int flag;
 MyNode pre;
 MyNode next;
 
    MyNode(int value,MyNode pre,MyNode next){
     this.pre=pre;
     this.next=next;
     this.value=value;
 }
    MyNode(){
 }
}


class MyList implements List{
 //定义一个带有头节点的双向循环链表
 private MyNode Head=new MyNode();   //头节点
 int length;    //链表长度
 MyList(){
  this.Head.next=Head;    //构造函数,创建一个头节点
  this.Head.pre=Head;
 }
 public MyList(int arr[]){  //尾插法创建一个链表,将指定数组中的元素插入
  this();      //创建一个只有头节点的链表
     //尾节点
  MyNode Rear=this.Head.next;
  Rear.next=this.Head;
  this.Head.next=Rear;
  
  for(int i=0;i<arr.length;i++){
   MyNode p=new MyNode();
   p.value=arr[i];
   Rear.next=p;
   p.pre=Rear;
   Rear=p;
   this.length++;
  }
  Rear.next=this.Head;
  Head.pre=Rear;
 }
 public int Length(){
  return this.length;
 }
 public void Delete(int index){  //删除指定位置的元素
  MyNode p=this.Head.next;
  for(int i=0;i<index;i++){
   p=p.next;
  }
  p.pre.next=p.next;
  p.next.pre=p.pre.next;
  this.length--;
 }
 //删除某个节点的操作
 public void Delete(MyNode p){
  p.pre.next=p.next;
  p.next.pre=p.pre;
  this.length--;
 }
 public void  print(){
  MyNode p=this.Head.next;
  for(int i=0;i<this.Length();i++){
   System.out.print(p.value+" ");
   p=p.next;
  }
  //System.out.println();
 }
 //实现题目所给功能:给每个节点增加一个Flag值,Flag值即1、2、3,从第一个节点开始,如果这个节点的
 //Flag值不等于3则,指针往下移,并且他的后继结点的Flag值等于它的前驱节点Flag值加1,如果该节点的

 //Flag值等于3,让他的后继结点的Flag值等于1,并且则删除这个节点,如此循环直到表的长度为1,则输出

 //该节点的value值!(如果某个节点的下一个节点是头节点,则需要将此节点指向头节点的下一个节点) 


 public void FindLast(){
  MyNode p=this.Head.next;
  p.flag=1;
  for(int count=1;this.Length()>1;){
   if(p.flag==3){  
    if(p.next==Head){          //如果某个节点的下一个节点是头节点,则指向头节点的下一个节点,因为头节点为空
     p=p.next.next;
     p.flag=1;
     System.out.println("第"+count+"次删除的是:"+p.pre.pre.value);
     Delete(p.pre.pre);
    }
    else {
     p.next.flag=1;
     p=p.next;
     System.out.println("第"+count+"次删除的是:"+p.pre.value);
     Delete(p.pre);
    }
    count++;
   }
   else{
    if(p.next==Head){
     p=p.next.next;
     p.flag=p.pre.pre.flag+1;
    }
    else{
    p=p.next;
    p.flag=p.pre.flag+1;
    }
    
   }
  }
  System.out.println("最后一次删除的是:"+p.value);
 }
}
public class Demo02 {

 public static void main(String[] args) {
 
  //测试是否创建成功
  int Arr[]={1,2,3,4,5};
  MyList l=new MyList(Arr);
  System.out.print("总人数为:");
  l.print();
  System.out.println();
  l.FindLast();
 }
 

}


0 0
原创粉丝点击