面試寶典174頁 面試例題
試題描述:已知n個人(編號1,2,3,4,...)圍坐在一張圓桌周圍。從編號爲k 的人開始報數,數到m的那個人出列,他的下一個人又開始從k開始報數,數到m的那個人又出列,以此規律重複下去,直到圓桌周圍的人全部出列。用c++實現。
核心步驟:(1)建立一個具有n個連結點、無頭節點的循環鏈表。
(2)確定第一個報數人的位置。
(3)不斷從鏈表中刪除節點,直到鏈表爲空。
//面試寶典174頁面試寶典
//建立無頭結點的循環鏈表
#include <iostream>
using namespace std;
typedef struct Node
{
int data;
struct Node* next;
}Node,*Linklist;//循環鏈表
Linklist Creat_linklist(int n)
{
Linklist head=(Linklist)malloc(sizeof(Node));//指向標號爲1的節點
//對第一個節點進行初始化
head->data=1;
head->next=head;
Linklist rear=head;//指向當前的尾節點
for (int i=2;i<=n;i++)
{
Linklist s=(Linklist)malloc(sizeof(Node));//用於存儲新插入的數據
s->data=i;//節點初始化
//更新鏈表
rear->next=s;
s->next=head;
rear=s;
}
return head;
}
//從標號爲k的人考試報數,數到m的那個人出列;(k<=m)
//從他的下一個人又從k開始報數,數到m的那個人出列
int Delete_Node(Linklist head,int k,int m)
{
if (NULL==head)
{
cout<<"There is no node!";
}
if (head==head->next)
{
cout<<"The linklist is empty!";
}
Linklist p=head;//指向中間的節點
Linklist q;//指向待刪除節點的前一個節點
for (int i=1;i<k-1;i++)
{
p=p->next;
q=p;
}
p=p->next;
while(p!=p->next)
{
if (k<=m)
{
for (int i=k;i<m;i++)//指向待刪除的節點
{
q=p;
p=p->next;
}
cout<<p->data<<" ";
q->next=p->next;
Linklist r=p;
p=q->next;
free(r);//釋放內存,防止內存泄露
}
else
{
cout<<"輸入的k應小於等於m!"<<endl;
}
}
return 0;
}
int main()
{
int n=10;
int k=2;
int m=4;
Linklist L=Creat_linklist(n);
Delete_Node(L,k,m);
return 0;
}