單向連結清單建立以及約瑟夫問題解決
package com.loopList;
public class LoopList {
public static void main(String[] args) {
Loop loop = new Loop();
loop.AddNode(7);//建立num個單向環形連結清單
loop.show_looplist();
pop(loop.getFirst(),4,2);//拿到單向環形連結清單指向第一個結點的指針
}
/**
*
* @param first_nodes//建立連結清單,指向第一個結點的指針
* @param start //開始喊數字的位置
* @param cur_num //喊幾個數
*/
public static void pop(ListNode first_nodes,int start,int cur_num)//約瑟父問題
{
ListNode first_node=first_nodes;
for (int i = 0; i <start-1 ; i++) {
first_node=first_node.next;//将指針移動到要叫号的位置
}
ListNode assit_ptr=first_node;
while (assit_ptr.next!=first_node)//為了将assit_ptr移動到環形最後一個結點上
{
assit_ptr=assit_ptr.next;
}
while (true)
{
if(first_node==assit_ptr)
{
break;
}
for (int i = 0; i <cur_num-1 ; i++) {
first_node=first_node.next;
assit_ptr=assit_ptr.next;
System.out.println("孩子"+first_node.data+"出圈");
}
first_node=first_node.next;
assit_ptr.next=first_node;
}
System.out.println("孩子"+assit_ptr.data+"出圈");
}
}
class ListNode//定義結點
{
public int data;//結點中的值域
public ListNode next;//結點中指向下一個節點的指針
public ListNode(int data) {
this.data = data;
}
}
class Loop//定義一個環形單連結清單
{
private ListNode first;
public ListNode getFirst() {
return first;
}
public void setFirst(ListNode first) {
this.first = first;
}
public Loop()//單向環形連結清單的無參構造方法
{
first = null;//定義一個指向第一個結點的指針
}
public void AddNode(int num) {
if (num < 1) {
System.out.println("添加元素有誤");
return;
}
/**
* 輔助指針
*/
ListNode cur_boy = null;
for (int i = 1; i <= num; i++) {
ListNode boy = new ListNode(i);
if (i == 1) {
first = boy;
first.next = first;
cur_boy = first;
} else {
cur_boy.next = boy;
boy.next = first;
cur_boy = boy;
}
}
}
public void show_looplist()
{
if (this.first == null) {
System.out.println("環形連結清單為空");
return;
}
ListNode temp = first;
while (temp.next != first) {
System.out.println("結點的值=" + temp.data);
temp = temp.next;
}
System.out.println("結點的值=" + temp.data);
}
}
結果運作圖:
結點的值=1
結點的值=2
結點的值=3
結點的值=4
結點的值=5
結點的值=6
結點的值=7
孩子5出圈
孩子7出圈
孩子2出圈
孩子4出圈
孩子1出圈
孩子6出圈
孩子3出圈