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

数据结构_循环链表

2015-04-13 20:24 190 查看
废话:依然开启我的恶补数据结构模式,还是链表(大神们莫喷,毕竟是学渣啊~~~~),这次是循环链表,其实根单链表没什么区别,就是在尾指针的指针域指向头结点或者是第一个节点。

面试题:已知n个人按1~n的编号围坐在一起,从第k个人开始报数,报道数为m的出列,直至全部出列(说白了就是约瑟夫环问题的实际场景罢了)。

解题思路:这种就是典型的用循环链表的方法来得到解决

1:建立带有n个节点的循环链表,最好是不带头结点的,因为这里带头结点处理比较繁琐

2:确定第一个人报数的位置即确定k所对应的节点的相应位置

3:就是处理将报数人对应的节点的指针前后关系

废话不多说,贴上代码:
<span style="font-size:14px;">typedef struct node
{
int data;
struct node * next;
}Lnode, *LinkList;

void JOSEPHUS(int n, int k, int m)
{
Lnode * temp, * cur, *first = NULL, *tail;

for(int i = 1; i<= n; i++)
{
temp = new Lnode();
temp->data = i;
if(first == NULL)
first = temp;
else
tail->next = temp;
tail = temp;
}
if(tail->next == NULL)
{
//将表尾指针域指向第一个节点
tail->next = first;
}
cur = first;

for(int j = 1; j < k-1; j++)//定位编号为k-1的位置
cur = cur->next;
while(n--)
{
for(int t = 1; t < m; t++)
{
cur = cur->next;
}
//上面定位到k-1的位置就是方便后面这里的处理
 cout<<cur->next->data<<endl;
cur->next = cur->next->next;
}
}</span>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: