双链表解决约瑟夫环

前几天去佳龙面试 有一道算法题
用双链表解决约瑟夫环问题
当时是和两个朋友一块去的 他们看完题直接走了 其实我是不想走的 但是从众心理太强
我也走了 后天周一 我要再去一趟哪里
其实我当时也不知道什么是约瑟夫环 就走了 而且面试的人态度很不好
这里是实现

class DoubleNode {
    public DoubleNode pre ;
    public DoubleNode next;
    public int data;

    public DoubleNode(int data) {
        this.data=data;
        pre=this;
        next=this;
    }
}
class DoubleList{
    public DoubleNode first;
    public DoubleNode last;
    public int size;

    // 初始化
    public DoubleList(DoubleNode dn) {
        first = dn;
        last= dn;
        size=1;
    }
    // 添加节点
    public void  addNode(DoubleNode node){
        last.next = node;
        node.pre=last;
        node.next=first;
        last = node;
        ++size;
    }
    //删除节点
    public void removeNode(int data){
        //如果删除的是第一个node
        DoubleNode current = first;
        if(data==first.data){
            last.next=first.next;
            first.next.pre=first.pre;
            System.out.println("删除掉了"+first.data);
            first=first.next;
            size--;
            return;
        }
        if(data==last.data){
            last.pre.next=first;
            first.pre=last.pre;
            System.out.println("删除掉了"+last.data);
            last=last.pre;
            size--;
            return;
        }
        for (int i = 0; i < size; i++) {
            if(current.data != data){
                current = current.next;
            }else {
                current.pre.next=current.next;
                current.next.pre=current.pre;
                System.out.println("删除掉了"+current.data);
                size--;
                return;
            }
        }
    }
    public void displayList(){
        DoubleNode current = first;
        for (int i = 0; i <size ; i++) {
            System.out.println(current.data);
            current = current.next;
        }
    }

}


上面是构造一个双链表结构

public class TestDoubleNode{
        public static void main(String[] args){
                yusefu(3,2);
        }
        /**
         * @param k
         * @param m
         */
        public static void yusefu(int k,int m){
                DoubleList dl = new DoubleList(new DoubleNode(1));
                for (int i = 2; i < 6; i++) {
                        DoubleNode db = new DoubleNode(i);
                        dl.addNode(db);
                }
                DoubleNode current = dl.first;

                for (int i = 0; i < k-1; i++) {
                       current = current.next;
                }

                while (dl.size!=1){
                        // 铲除数到m的人
                        DoubleNode firstCall = current;
                        DoubleNode killNode = null;

                        for (int i = 1; i < m ; i++) {
                                killNode = firstCall.next;
                        }
                        dl.removeNode(killNode.data);

                        if(dl.size==1){
                                break;
                        }
                        current = killNode.next;
                }
                dl.displayList();
        }


}

其实很简单 只是大学没怎么学数据结构 气人哪

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值