我正在做一个约瑟夫环 怎样做才能成为一个循环的链表?
是在最后的myNode类最什么改变吗?/*c current 表示当前节点
* ci currentindex 表示当前节点的下标
* i=index 起始节点的下标
*
* */public class A{
myNode first;
int length;
void Init(){
first=null;
}
void Tshow(){
myNode c=first;
while(c!=null){
c.show();
c=c.next;
}
}
//**********************************
int length(){
length=0;
myNode c=first;
while(c!=null){
length++;
c=c.next;
}
return length;
}
//**********************************
void add(int value){
myNode newN=new myNode();
newN.data=value;
add(newN);
}
void add(myNode newN){
if(first==null){
first=newN;
return;
}
/*
myNode c=first;//使当前节点为first
while(c.next!=null){//如果c的下面一个节点不是空的 就一个个的往后挪
c=c.next;
}
c.next=newN;//会执行此句话 表示c已经是最后一个节点 那么将新的节点赋给c.next
*/
//当然了 上面那一部分也是对的 不过都用c==null和del ins的方法一致
myNode p;
myNode c=first;
while(c!=null){
p=c;
c=c.next;
if(c==null){
p.next=newN;
return;
}
}
}
//约瑟夫环开始
//**********************************
void Joseph(int i){
/*if(i==0){
if(first==null)
return;
first=first.next;
}*/
int ci=0;//我想一开始从位置值0开始 就是第一个节点
myNode p;
myNode c=first;
length=length();//返回现有节点的个数
while(length>1){
int data=c.re();//读入节点的数据
for(int m=1;m<=data;m++){
p=c;
c=c.next;
if(m==data){
c.show();// 问题就在这里 因为还没有实现循环链 执行一次后这里就空了
p.next=c.next;
c=c.next;
}
}
length=length-1;
}
}//**********************************
public static void main(String args[]){
A ob=new A();
//ob.Init();
ob.add(2);
ob.add(3);
ob.add(4);
ob.add(1);
ob.Joseph(0);
}
}
class myNode{
int data;
myNode next;
void show(){
System.out.println(data);
}
int re(){
return data;
}
}
是在最后的myNode类最什么改变吗?/*c current 表示当前节点
* ci currentindex 表示当前节点的下标
* i=index 起始节点的下标
*
* */public class A{
myNode first;
int length;
void Init(){
first=null;
}
void Tshow(){
myNode c=first;
while(c!=null){
c.show();
c=c.next;
}
}
//**********************************
int length(){
length=0;
myNode c=first;
while(c!=null){
length++;
c=c.next;
}
return length;
}
//**********************************
void add(int value){
myNode newN=new myNode();
newN.data=value;
add(newN);
}
void add(myNode newN){
if(first==null){
first=newN;
return;
}
/*
myNode c=first;//使当前节点为first
while(c.next!=null){//如果c的下面一个节点不是空的 就一个个的往后挪
c=c.next;
}
c.next=newN;//会执行此句话 表示c已经是最后一个节点 那么将新的节点赋给c.next
*/
//当然了 上面那一部分也是对的 不过都用c==null和del ins的方法一致
myNode p;
myNode c=first;
while(c!=null){
p=c;
c=c.next;
if(c==null){
p.next=newN;
return;
}
}
}
//约瑟夫环开始
//**********************************
void Joseph(int i){
/*if(i==0){
if(first==null)
return;
first=first.next;
}*/
int ci=0;//我想一开始从位置值0开始 就是第一个节点
myNode p;
myNode c=first;
length=length();//返回现有节点的个数
while(length>1){
int data=c.re();//读入节点的数据
for(int m=1;m<=data;m++){
p=c;
c=c.next;
if(m==data){
c.show();// 问题就在这里 因为还没有实现循环链 执行一次后这里就空了
p.next=c.next;
c=c.next;
}
}
length=length-1;
}
}//**********************************
public static void main(String args[]){
A ob=new A();
//ob.Init();
ob.add(2);
ob.add(3);
ob.add(4);
ob.add(1);
ob.Joseph(0);
}
}
class myNode{
int data;
myNode next;
void show(){
System.out.println(data);
}
int re(){
return data;
}
}
比如建表时,若采用尾插法,每次插入新节点时将其next指向第一个节点。
* ci currentindex 表示当前节点的下标
* i=index 起始节点的下标
*
* */ public class A{
myNode first;
int length;
void Init(){
first=null;
}
void Tshow(){
myNode c=first;
if(c!=null){
do{
c.show();
c=c.next;
}while(c!=first);
}
}
//**********************************
int length(){
length=0;
myNode c=first;
if(c!=null){
do{
length++;
c=c.next;
}while(c!=first);
}
return length;
}
//**********************************
void add(int value){
myNode newN=new myNode();
newN.data=value;
add(newN);
}
void add(myNode newN){
if(first==null){
first=newN;
newN.next=first;
return;
}
/*
myNode c=first;//使当前节点为first
while(c.next!=null){//如果c的下面一个节点不是空的 就一个个的往后挪
c=c.next;
}
c.next=newN;//会执行此句话 表示c已经是最后一个节点 那么将新的节点赋给c.next
*/
//当然了 上面那一部分也是对的 不过都用c==null和del ins的方法一致
myNode p;
myNode c=first;
p=c;
c=c.next;
while(c!=first){
p=c;
c=c.next;
}
p.next=newN;
newN.next=first;
}
//约瑟夫环开始
//**********************************
//------你是不是没有理解发约瑟夫问题啊?不是应该报数,报到某一个数时,这个人出列吗?
//所以我修改一下你的代码:
//num表示,数到num,这个人出列.
void Joseph(int num){
/*if(i==0){
if(first==null)
return;
first=first.next;
}*/
myNode c=first,p=first;
length=length();//返回现有节点的个数
while(length>1){
//int data=c.re();//读入节点的数据
for(int m=1;m <num;m++){
p=c;
c=c.next;
}
if(first==c){
first=c.next;
}
p.next=c.next;
c=p.next;
Tshow();
System.out.println("----------");
length--;
}
} //**********************************
public static void main(String args[]){
A ob=new A();
//ob.Init();
ob.add(1);
ob.add(2);
ob.add(3);
ob.add(4);
ob.Joseph(3);
}
}
class myNode{
int data;
myNode next;
void show(){
System.out.println(data);
}
int re(){
return data;
}
}
应该是报数 但报的数是删去的那个人所持有的密码,也就是每个节点的data呀,所以每次轮回,所数的数都不应该相同 ,因为他们的密码不同啊,所以我用data ,
你这样做每次数的就是一个数了。