循環鏈表

面試寶典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;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章