更新一下,昨天的代码有点问题,没有考虑到头结点的影响,我的方法是:
在进行步数位移的时候判断标记点,如果走到了头结点,就在循环里面立即往后再位移一次,把头结点跳过;同时在后面删除元素的时候,再次判断位移点有不有走到头结点,如果走到了的话,就直接再往后移动一位,这样就成功跳过头结点了
单独拎出来约瑟夫环实现代码,函数封装
//约瑟夫
int link_yue(NodePtr L, int flag) {
if (L == NULL || flag <= 0 || link_empty(L)) {
printf("输入的参数有误或链表为空。\n");
return -1;
}
NodePtr prev = L;
NodePtr curr = L->next;
while (L->len > 1)
{
for (int count = 0; count < flag-1; count++)
{
prev = curr;
curr = curr->next;
if(curr == L) //在这里加入了一个if判断条件,判断在位移的时候有不有经过头节点,经过就跳过
{
prev = curr;
curr = curr->next;
}
}
printf("删除节点的值为: %d\n", cu