循环链表——跳海问题
题目:因为轮船要沉没,需要船员跳海保护轮船,船员围坐一圈,首先指出从第几号开始,顺序数七个人,被数到的人跳海,循环直到只剩一人。
思路:用循环链表。
结构体:
struct linklist{
int data;
struct linklist *next;
};
typedef struct linklist * linknode;
创建循环链表:
linknode sub,temp;
linknode creat(int n){
linknode L=new linklist;
linknode last=L;
L->next=NULL;
for(int i=0;i<n;i++){
linknode p=new linklist;
p->data=i+1;
last->next=p;
last=p;
}
last->next=L->next;
return L->next;
}
注意这道题目不能含有头指针,从第一个有效节点开始,其数据域为1!
选出跳海的人:
int left(linknode &S,int r,int n){
linknode temp=S,q;
for(int i=0;i<r-1;i++)
temp=temp->next; //从第r个开始
while(n>1){
for(int j=0;j<5;j++) //删除从他之后第七个,先找到从他之后第六个
temp=temp->next;
q=temp->next;
temp->next=q->next;
delete q;
temp=temp->next;
n--;
}
return temp->data;
}
主函数:
int main(){
linknode test=creat(4);
int theOne=left(test,1,4);
int a=theOne;
cout<<a<<endl;
}