連結串列面試題(八)---約瑟夫環

gogogo_sky發表於2017-05-17

一、結構體定義

typedef int DataType;

typedef struct ListNode//定義結點
{
    DataType data;
    struct ListNode* next;
}ListNode,*PListNode;

typedef struct  PList//定義一個成員是指向結點的指標的結構體
{
    PListNode PHead;
}PList,*PList;

二、約瑟夫環介紹
給一個迴圈單連結串列(最後一個結點的next指向第一個結點),這時形成了環,從連結串列第一個結點
開始數,每數num個結點,停下來,將第num個結點刪掉,然後從下一個結點又開始從1數起,每數num個結點,刪除一個;這樣一直迴圈著在連結串列數結點,刪結點,最後剩下一個結點。
//最後只剩下約瑟夫活著(哈哈)
三、函式實現

PListNode JosephCycle(PListNode PHead,int num)
{
     PListNode cur=PHead;
     PListNode del=PHead;
     int k=0;
     if (PListNode==NULL)
     {
         return NULL;
     }
     while (1)
     {
         if (cur==cur->next)//如果只剩下一個結點,則這個結點就是最後剩下的結點
             break;
         k=num;
         while (--k)//每走num-1步即可到達要刪除的結點位置;
         {
             cur=cur->next;
         }
         //用值交換法,刪除結點
         printf("killed:%d",cur->data);
         del=cur->next;
         cur->data=del->data;
         cur->next=del->next;
         free(del);
     }
     return cur;
}

相關文章