面試題之約瑟夫問題 迴圈鍊錶簡單詳述

2021-05-27 00:24:21 字數 1311 閱讀 8702

迴圈鍊錶的運算與單鏈表的運算基本一致,所不同的有以下幾點:

(1)在建立乙個迴圈鍊錶時,必須使其最後乙個節點的指標指向表頭節點,而不是像單鏈表那樣置為null。此種情況適用於在最後乙個節點後插入乙個新節點。

(2)判斷是否到表尾採用判斷該節點鏈域的值是否是表頭節點的方法,當鏈域值等於表頭指標時,說明已到表尾,而不是像單鏈表那樣判斷鏈域值是否為null。

約瑟夫問題:編號為1~n的n個人按順時針方向圍坐一圈,每人持有乙個密碼(正整數),開始人選乙個正整數作為報數上限值m,從第乙個人按順時針方向自1開始順序報數,報道m時停止報數。報m的人出列,將他的密碼作為新的m值,從他順時針方向上的下乙個人開始從1報數,如此下去,直至所有人全部出列為止。

這種題目是以前參加acm時,當作練習的題目,以前都是用陣列來做,但現在用迴圈鍊錶解答。

#include #include #include #include typedef struct node

node;

//建立迴圈鍊錶方法1

node *create_node(int n)

else

pret = p_node;

while(n_idx < n)

p_node->data = n;

p_node->next = pret;

} return pret;

}//建立迴圈鍊錶方法2

node *create_node1(int n)

head->data = n_idx;

head->next = null;

before = head;

n_idx++;

while(n_idx <= n)

new_node->data = n_idx;

new_node->next = null;

before->next = new_node;

before = new_node;

n_idx++;

} new_node->next = head; //鍊錶尾指標指向頭指標。

return head;

}int main()

printf("%d ", piter->next->data); //輸出第m個節點的值

piter->next = piter->next->next; //從鍊錶中刪除第m個節點

piter = piter->next; //從下乙個節點開始

} printf("%d\n", piter->data);

delete plist;

return 0;

}

C 迴圈鍊錶之約瑟夫問題

前天學了迴圈鍊錶,一直再沒管,今天來應用一下,感覺自己寫麻煩了 迴圈鍊錶與單鏈表的區別就在於表尾指標不是null,而是等於first。這就產生了乙個好處就是可以從任何節點開始訪問到所有節點。includeusing namespace std struct people class josephus...

資料結構 迴圈鍊錶之約瑟夫問題

include include include using namespace std define elemtype string typedef struct lnode lnode,listq 迴圈鍊錶初始化 頭針指lq向最後乙個資料 bool initiallist listq lq ito...

資料結構之約瑟夫迴圈鍊錶

public class test public class joseph 如果不是首節點 node newnode newnode i,null 建立乙個新節點 pre.next newnode 為當前節點儲存下個節點 pre newnode 將新節點設為當前節點 if i total int c...