您的位置:首页 > 理论基础 > 数据结构算法

数据结构学习笔记(3)---循环链表(约瑟夫环问题)

2017-09-15 13:09 218 查看
最近学习循环链表,其实循环链表的本质和单向链表没有多大区别的,只是在创建时把最后的指针指向头结点,但是当想用循环链表解决约瑟夫环的问题时,要去掉头结点。

[b](1)循环链表的创建[/b]

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;//别忘记对p赋值
}
return p;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构 链表