1.循环链表–约瑟夫环
n个人围成一圈,从第一个人开始报数1、2、3。凡报到3者退出圈子。 找出最后留在圈子中的人的序号。
#include <iostream>
using namespace std;
struct node
{
int data;
node *next;
};
int main()
{
node *head, *p, *q; // head为链表头
int n, i;
//输入n
cout << "\ninput n:"; cin >> n;
//建立链表
head = p = new node;
p->data = 0; //p指向表尾
for (i = 1; i < n; ++i)
{
q = new node; //q为当前正在创建的节点
q->data = i;
p->next = q; p = q; //将q链入表尾
}
p->next = head; // 头尾相连
// 删除过程
q = head;
while (q->next != q) { //只要表非空
p = q->next;
q = p->next;
p->next = q->next; //绕过节点q
cout << q->data << '\t'; //显示被删者的编号
delete q; //回收被删者的空间而不是删除指针q
q = p->next; //让q指向报1的节点
}
// 打印结果
cout << "\n最后剩下: " << q->data << endl;
return 0;
}