最近学习循环链表,其实循环链表的本质和单向链表没有多大区别的,只是在创建时把最后的指针指向头结点,但是当想用循环链表解决约瑟夫环的问题时,要去掉头结点。
(1)循环链表的创建
void CreateCircleList(pCircleNode pHead)
{
int date;
cout << "请输入节点得值:";
cin >> date;
pCircleNode pTail = pHead;
while (-1 != date)
{
pCircleNode pNew = new CircleNode;
pNew->next = NULL;
pNew->date = date;
pTail->next = pNew;
pTail = pNew;
cout << "请输入节点得值:";
cin >> date;
}
pTail->next = pHead->next;
}
(2)显示循环链表
void ShowList(pCircleNode pHead)
{
pCircleNode p = pHead->next;
do
{
cout << p->date<<" ";
p = p->next;
} while (p != pHead->next);
cout << endl;
}
(3)用循环链表解决约瑟夫环问题
pCircleNode Joseph(pCircleNode pHead, int n)
{
pCircleNode p = pHead;
pCircleNode pPre = NULL;;
while (p->next != pHead)
{
p = p->next;
}
pPre = p;
p = pHead;
pHead = NULL;
while (p->next != p)
{
int nPos = 1;
while (nPos != n)
{
pPre = p;
p = p->next;
nPos++;
}
pCircleNode pDelete = pPre->next;
pPre ->next = pPre->next->next;
delete pDelete;
p = pPre->next;
}
return p;
}