天天看點

單向連結清單解決約瑟夫問題

單向連結清單建立以及約瑟夫問題解決

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出圈