1. 程式人生 > >迴圈連結串列 實現 約瑟夫環

迴圈連結串列 實現 約瑟夫環

約瑟夫環問題

已知 n 個人(n>=1)圍坐一圓桌周圍,從 1 開始順序編號,從序號為 1 的人開始報數,順時針數到 m 的那個人出列。下一個人又從 1 開始報數,數到m 的那個人又出列。依此規則重複下去,直到所有人全部出列。請問最後一個出列的人的初始編號。

【要求

輸入人數 n,所報數 m,輸出最後一個人的初始編號。

約瑟夫環問題解決思路

首先因為是圓桌問題,使用連結串列解決的話需要構建迴圈連結串列

接著是出列問題,這裡我的設計思路是將指向連結串列的指標移動到需要出列的人的位置,然後根據正常的連結串列刪除進行操作即可。

#include <iostream>
using namespace std;

typedef struct node{
	int data;
	node * next;
} LNode, *LinkNode;		// LNode 定義結構體變數, LinkNode 定義結構體指標

int main()
{
	int n, m;
	LinkNode head, p, r;
	cin >> n >> m;
	head = new LNode;	// 先給第一個節點申請儲存空間
	head->data = 1;
	head->next = NULL;
	r = head;
	for(int i=2; i<=n; i++)
	{
		p = new LNode;	// 申請一個新節點
		p->data = i;
		p->next = NULL;	// 後繼為空
		r->next = p;	// 前驅指向當前節點
		r = p;			// 後移指標,始終保持指向最後一個節點

	}
	r->next = head;		// 首位相連
	int num  = 0;
	for(int i=1; i<=n; i++)
	{
		for(int j=1; j<=m-2; j++)	// 從一迴圈到m-2,然後指標移到了應當刪除節點的前一個
			r = r->next;
		LinkNode tmp = r->next;		// 儲存要刪除的結點
		cout << r->next->data << " ";	// 輸出
		num = r->next->data;		// num留到最後輸出,輸出的是最後一個結點
		r->next = r->next->next;	// 將要被刪除的結點的前後結點相連
		r = r->next;	// r 後移 從下一個結點開始下一個迴圈
		delete tmp;		// 釋放刪除節點的空間
	}
	cout << endl;
	cout << num << endl;

	return 0;
}

相關推薦

迴圈連結串列 實現

【約瑟夫環問題】 已知 n 個人(n>=1)圍坐一圓桌周圍,從 1 開始順序編號,從序號為 1 的人開始報數,順時針數到 m 的那個人出列。下一個人又從 1 開始報數,數到m 的那個人又出列

迴圈連結串列解決的問題

約瑟夫環問題簡介  約瑟夫環問題的原來描述為,設有編號為1,2,……,n的n(n>0)個人圍成一個圈,從第1個人開始報數,報到m時停止報數,報m的人出圈,再從他的下一個人起重新報數,報到m時停止報數,報m的出圈,……,如此下去,直到所有人全部出圈為止。當任意給定n和m後,設計演算法求n個人出

Problem E: 用連結串列實現

Description 你聽說過約瑟夫問題嗎?問題大致如下:首先n個人圍成一個圈,標記為1到n號。接著,從1號開始報數(從1開始),然後2號報數,然後3號。。。當有人報到到m時,這個人就要踢出比賽,然後從被踢出的人的下一個人開始,重新報數(從1開始)。這樣經過n-1次後,就只剩下了一個人,問最後剩下的

資料結構——迴圈連結串列、僅設尾指標的迴圈連結串列

1 //迴圈連結串列,連結串列的尾結點的link域中不是NULL,而是存放了指標連結串列開始結點的指標 2 ////設p是在迴圈連結串列中逐個結點檢測指標,則在判斷p是否達到連結串列的鏈尾時p->link == first 3 4 5 //迴圈

單向迴圈連結串列模擬

約瑟夫環問題,編好為1,2,3....n的個人按順時針圍坐一圈,每人手持一個密碼。一開始選定m=6,從第一個人開始順時針方向自1開始順序報數,報到m時停止報數。報m的人出列,將他的密碼作為新的m值,從他在順時針方向上的下一個人開始重新從1報數,如此下去,直至所有人全部出列為止

迴圈連結串列的問題

在程式設計師面試寶典中,有道面試題如下: 已知n個人(以編號1,2,3,,...,n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;從他的下個開始,數到k重新數數,數m個數,那個人出列;以此重複下去,直到圓桌周圍的人全部出列。試用C++程式設計實現

使用環形連結串列實現

連結串列實現Josephus約瑟夫環問題如下,輸出每輪殺掉的人的編號,並且輸出最後剩下的一名幸運者。 標頭檔案如下 #ifndef JOSEPHLIST_H #define JOSEPHLIST_H #include <stdio.h> typedef st

Java 使用連結串列實現

約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。求出出隊序列。 採用連結串列實現,結點資

單向迴圈連結串列練習-問題

開發十年,就只剩下這套架構體系了! >>>   

連結串列解決問題

第一次做約瑟夫環問題,歡迎大家來找茬~ 如果做單迴圈連結串列時有點暈了,要畫圖要畫圖要畫圖,重要的事講三遍,因為真的是很好的方法。 #include<stdio.h> #include<stdlib.h> typedef struc

使用連結串列解決的問題

已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為1的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列,問最後一個出環的人的原編號。 用在單鏈表中刪除一個結點的思想

使用連結串列解決問題

1139 約瑟夫環問題 時間限制:500MS 記憶體限制:65536K 提交次數:157 通過次數:79 題型: 程式設計題 語言: G++;GCC Description 約瑟夫(josephus)環是這樣的:假設有n個小孩圍坐成一個圓圈,並從1開始依次

靜態連結串列解決問題

#include<stdio.h> #define MAXSIZE 100  struct {  int  cur ;  int  number;  int  secret_node; }space[MAXSIZE]; int main(void) {  int

線性表---單迴圈連結串列問題)

約瑟夫環問題: 已知n個人(以編號1,2,3…n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。 程式碼: #include <i

(學習java)用java語言構造的迴圈連結串列解決問題

//josephus問題 41個人1-3報數,數到3的自殺,最後剩餘的2個人結點資料 public class Josephus { public static void main(String[] args) { SLineList s = new SLineLis

迴圈連結串列問題(非常詳細易理解)

約瑟夫問題來源 據說著名猶太曆史學家 Josephus有過以下的故事:在羅馬人佔領喬塔帕特後,39個猶太人與Josephus及他的朋友躲到一個洞中,39個猶太人決定寧願死也不要被敵人抓到,於是決定了一個自殺方式,41個人排成一個圓圈,由第1個人開始報數,每報數到第3人該人就

JS資料結構第三篇---雙向連結串列迴圈連結串列問題

一、雙向連結串列 在上文《JS資料結構第二篇---連結串列》中描述的是單向連結串列。單向連結串列是指每個節點都存有指向下一個節點的地址,雙向連結串列則是在單向連結串列的基礎上,給每個節點增加一個指向上一個節點的地址。然後頭結點的上一個節點,和尾結點的下一個節點都指向null。同時LinkedList類中再增

資料結構---連結串列問題帶來的思考

連結串列和陣列一樣也是線性表的一種。和陣列不同,它不需要再記憶體中開闢連續的空間。 連結串列通過指標將一組零散的記憶體塊連線在一起。我們把記憶體塊稱為連結串列的“結點”(是節點還是結點,結點連線起來打個結所以叫“結點”?開個玩笑),也就是說這些結點可以在記憶體的任意地方,只要有其他的結點的指標指向這個位置就可

用C++實現的問題

content 人在 -h tel padding next family bsp sun 約瑟夫問題是個有名的問題:N個人圍成一圈。從第一個開始報數,第M個將被殺掉,最後剩下一個,其余人都將被殺掉。比如N=6,M=5。被殺掉的人的序號為5,4,6。2。3。最後剩下1

實現

賦值 答案 就是 必須 創意 class 復習 標記 sys 最近在看關於約瑟夫環的一些解決思路,發現了一種很有創意的解法,記錄下,用來復習。 //用於判斷某個數是否已經被剔除 boolean[] isChoosed = new boolean[n];