天天看點

「優質題解」出圈

「優質題解」出圈

這道題的位址,想嘗試的小夥伴可以來試哦:

https://www.dotcpp.com/oj/problem1160.html

思路:

解題思路:(原:1047: C語言程式設計教程(第三版)課後習題10.5)在1047的 的基礎上,把報數的數m改為自己輸入,同時改為多組測試資料,并且輸出帶換行符;

思路一:(公式法)

「優質題解」出圈

思路二(循環連結清單法)

1:建立長度為n的循環連結清單(單連結清單的最後一個結點與首結點連接配接,不是頭結點);

2:連結清單結點包括編号和next指針;

3:從首結點p開始報數(p=p->next),但是隻報數到離開的結點的前一個結點,然後删除它後面的結點,更新報數的第一個結 點(p=p—>next);用指針q指向要删除的結點;

4:重複上述過程,直到連結清單中隻有一個結點結束(即:p->next=p);

5:如下圖假設有6個結點(6個人),報數數為3;

「優質題解」出圈
「優質題解」出圈

把頭結點free了,因為删除過程中,頭結點的next被删除的話,頭結點next指向不安全地方,就不要用它了;

「優質題解」出圈
「優質題解」出圈
「優質題解」出圈

以上就是連結清單的實作過程,要挑戰自己可以弄一個單連結清單實作的,再厲害一點可以順序表,但順序表不推薦,

1.順序表删除要移動大量元素

2.報數到最後一個之後,傳回第一個的實作過程複雜,需要用下标關系,很容易暈;

注意事項:

每個結點删除後都要free了,輸出留下來的那個人之後也要把它的free了,輸出帶換行符;

參考代碼:

「優質題解」出圈