分析:
比如由5個節點組成乙個環,從第1個節點開始報數,每報數2個節點刪除乙個節點,單鏈表如下:
(1)設定乙個helper輔助節點,指向最後乙個節點:
(2)因為是從第k個節點開始報數,因此先讓first和helper走k-1步,這樣first節點就指向報數的第乙個節點了,k初始值為1,因此不用向前走
(3)然後開始刪除節點,每次讓helper和first向前走1步,走了m-1步支行,first指向乙個要刪除的節點,第乙個要刪除的節點如下:
(4)讓first=first.next,helper.next=first,則第2個節點刪除:
(5)重複第4和第5步,直到helper等於first時,證明只有最後乙個節點
(6)刪除最後乙個節點
實現:
public
class
josepfu
list.
print()
; list.
josepfu(1
,2);
}}class
circlesinglelinkedlist
else
temp.next = node;
node.next = first;}}
public
void
print()
node temp = first;
while
(temp.next != first)
system.out.
print
(temp.num)
; system.out.
print
(" ");
system.out.
println
("\n---------------");
}//從第k個節點報數,報數m次刪除乙個節點
public
void
josepfu
(int k,
int m)
node helper = first;
//輔助節點
//先讓輔助節點指向最後乙個節點
while
(helper.next != first)
//讓helper和first節點向前走k-1次
for(
int i =
1; i < k; i++
)//當helper等於first的時候,只剩下乙個節點
while
(helper != first)
system.out.
println
(first.num)
; first = first.next;
helper.next = first;
} system.out.
println
(first.num);}
}//節點定義
class
node
}
單鏈表實現約瑟夫環問題
首先我們來了解一下什麼是約瑟夫環 約瑟夫環 約瑟夫環問題 是乙個數學的應用問題 已知n個人 以編號1,2,3.n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從1開始報數,數到m的那個人又出列 依此規律重複下去,直到圓桌周圍只剩下乙個人。今天用單鏈表實現約瑟...
約瑟夫環 單鏈表
此演算法將頭指標head也進行data賦值 include typedef struct node 定義結構體 linknode,link int main void josephu link head,int n,int k,int m 此演算法將頭指標head賦予data值,以便於迴圈鍊錶結點的...
迴圈單鏈表 Joseph約瑟夫環問題
package com.linkedlist author qw date 2020 8 11 22 02 public class josephcircle 迴圈單鏈表 class circlesinglelinkedlist child cur null 輔助指標,幫助構建迴圈鍊錶 for in...