約瑟夫環(約瑟夫問題)是乙個數學的應用問題:已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下乙個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。通常解決這類問題時我們把編號從0~n-1,最後結果+1即為原問題的解。下面是我畫的乙個對於一共有8個結點的環,每次報到3的時候就刪除這個結點的展示圖:
綜上步驟:
第一步:從1開始報數為3的時候就刪除3號結點第二步:從4號結點開始報數,當為3的時候刪除6號結點;
第三步:從7號結點開始報數,當為3的時候刪除1號結點;
第四步:從2號結點開始報數,當為3的時候刪除5號結點;
第五步:從7號結點開始報數,當為3的時候刪除2號結點;
第六步:從4號元素開始報數,當為3的時候刪除8號結點;
第七步:又從4號開始報數,當為3的時候刪除4號結點,此時鍊錶中只有乙個7號結點,所以最後的結點就是7號結點;
//約瑟夫環問題:列印依次被刪的序列號並保留最後乙個
void josephuscycle(pnode* pplist,size_t k)
printf("刪除的是:%d\n",pcur->
data);
pdel = pcur->pnext;
pcur->
data
= pdel->
data;
pcur->pnext = pdel->pnext;
free(pdel);
pdel =
null;
}printf("最後倖存的是:%d\n", pcur->
data);
}//尾插 (1.檢查鍊錶是否存在
// 2.存在為空直接插入
// 3.存在不為空先找到最後節點)
void pushback(plist* pplist, datatype d)
//為空直接插入
if (null
==*pplist)
//存在不為空找到最後節點
else
pcur->pnext = pnewnode;
}}//查詢
pnode find(plist pplist, datatype d)
pcur = pcur->pnext;
}return
null;
}//測試
void testjosephuscycle()
printlist(plist);
//構成環
find(plist, 8)->pnext = plist;
josephuscycle(&plist,3);
}
結語:只有自己知道自己的付出的多少,望星耀星空,花艷四方!
劍指Offer 翻轉單鏈表
定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出反轉後鍊錶的頭結點。樣例輸入 1 2 3 4 5 null 輸出 5 4 3 2 1 null有兩種方法。一種直觀的方法是使用棧,利用棧先進後出的特性。將節點的值全部壓入棧,出棧的時候需要建立新的節點,連成鍊錶。這裡注意不要直接把鍊錶中的各個節點丟...
劍指offer 約瑟夫環
提交 nowcode 其實是乙個一步步從最後只剩乙個人到還原第一次n個人編號的過程,而不是一步步把每次出局的人找出來,其實過程是未知的 n個小朋友們圍成乙個大圈,編號0 n 1 隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m 1的那個小朋友要出列唱歌,並且不再回到圈中 從剛出列的下乙個小朋...
劍指offer 約瑟夫環
每年六一兒童節,牛客都會準備一些小禮物去看望孤兒院的小朋友,今年亦是如此。hf作為牛客的資深元老,自然也準備了一些小遊戲。其中,有個遊戲是這樣的 首先,讓小朋友們圍成乙個大圈。然後,他隨機指定乙個數m,讓編號為0的小朋友開始報數。每次喊到m 1的那個小朋友要出列唱首歌,然後可以在禮品箱中任意的挑選禮...