数据结构与算法(六)

单向循环链表解决猴子选大王问题:

有50只猴子围坐一圈选大王,编号分别是1到50,从第1只猴子开始报数,每报到7的猴子出局,剩下的最后一只猴子就是大王。

这个问题使用单向循环链表解决起来比较简单,废话不多说,直接上代码。

public class CircleLink {

    private int size;

    Node head;

    Node tail;

    /**

     * 在链表尾部插入一个元素

     * @param data 要插入的数据

     */

    public void add(int data){

        Node newNode = new Node(data);

        if(head==null){

            newNode.next = newNode;

            head = tail = newNode;

        }else{

            tail.next = newNode;

            newNode.next = head;

            tail = newNode;

        }

        size++;

    }

    /**

     * 在链表头部插入一个元素

     * @param data 要插入的数据

     */

    public void addHead(int data){

        Node newNode = new Node(data);

        if(head==null){

            newNode.next = newNode;

            head = tail = newNode;

        }else{

            tail.next=newNode;

            newNode.next=head;

            head=newNode;

        }

        size++;

    }

    public void delete (Node node){

        int data = node.data;

        if(node.data == head.data){

            deleteHead();

            return;

        }else {

            for(Node temp = head; temp!=tail; temp = temp.next){

                if (data==temp.next.data) {

                    if(temp.next==tail){

                        deleteTail();

                        return;

                    }else {

                        temp.next = temp.next.next;

                        size--;

                        return;

                    }

                }

            }

        }

        System.out.println("指定的目标数据不存在");

    }

    

    //遍历链表

    public void print(){

        Node tempNode=head;

        while(tempNode!=tail){

            System.out.println(tempNode.data);

            tempNode = tempNode.next;

        }

        System.out.println(tail.data);

    }

    //获取链表元素个数

    public int size(){

        return size;

    }

    class Node{

        int data;

        Node next;//下一节点

        Node(int data){

            this.data = data;

            this.next = null;

        }

    }

    

}

public class Test01 {

    public static void main(String[] args){

        CircleLink link = new CircleLink();

        //初始化循环列表,并赋值

        for(int i = 1;i<=100;i++){

            link.add(i);

        }

        CircleLink.Node temp = link.head;

        while(link.size()>1){//一直报数下去,直到剩余的元素数量为1

            for(int i = 0;i<7;i++){//每报到7,就把报7的元素删除掉

                if(i==6){

//打印出圈顺序

                    System.out.println(temp.data);

                    link.delete(temp);

                }

                temp = temp.next;

            }

        }

        link.print();

    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值