双循环链表的java实现——《算法》读书笔记

本贴最后更新于 3384 天前,其中的信息可能已经时移世异

####这是一个双链表环,从头插入元素,可以实现从任意地方删除元素,测试是约瑟夫问题。

添加元素的时间复杂度为 O(1),删除元素的时间复杂度为 O(1).由于约瑟夫问题是在不停的删除元素,现在假设有 n 个元素,每 hop 个元素自杀一次。总共删除 n-1 次,每删除一次走 hop 步。所以约瑟夫问题的时间复杂度为 O(hop*(n-1))=O(n*hop)。

import java.util.Iterator; /** * Created by dog on 3/25/16. * 这是一个双链表环,从头插入元素,可以实现从任意地方删除元素 */ public class CircularDoubleLinked<Item> implements Iterable<Item>{ private Node head; private Node tail; private int N; public CircularDoubleLinked(){ head = new Node(); tail = new Node(); } private class Node{ Item item; Node left; Node right; } public int size(){ return N; } public boolean isEmpty(){ return size()==0; } public void push(Item item){ if(isEmpty()){ Node newFirst = new Node(); newFirst.item=item; head.right = newFirst; tail.left=newFirst; }else { Node newFirst = new Node(); newFirst.item=item; newFirst.right = head.right; head.right.left=newFirst; newFirst.left = tail.left; tail.left.right=newFirst; head.right=newFirst; } N++; } public Item remove(Node node){ if(node!=null) { Item item = node.item; if (node == head.right) { Node last = node.left; Node next = node.right; last.right = next; next.left = last; head.right = node.right; node.right = null; node.left = null; node = null; } else if (node == tail.left) { Node last = node.left; Node next = node.right; last.right = next; next.left = last; tail.left = node.left; node.right = null; node.left = null; node = null; } else { Node last = node.left; Node next = node.right; last.right = next; next.left = last; node.right = null; node.left = null; node = null; } N--; return item; }else { return null; } } @Override public ListIterator iterator() { return new ListIterator(); } private class ListIterator implements Iterator<Item>{ Node current = head.right; Node follow = head; @Override public boolean hasNext() { if(current!=null && size()>0){ return true; }else { return false; } } @Override public Item next() { Item item = current.item; //System.out.println("current:地址"+current); follow=current; current=current.right; return item; } @Override public void remove() { Node temp = follow.right ; System.out.println(CircularDoubleLinked.this.remove(follow)); follow = temp; } } public static void main(String[]args){ //丢手绢问题的实现 //test //每hop个人报数一次 int N = 41; int hop = 3; CircularDoubleLinked d = new CircularDoubleLinked<Integer>(); //添加元素 for(int i=N;i>0;i--) d.push(i); //开始游戏 int k=1; for(Iterator i = d.iterator() ;d.size()>1;) { i.next(); if(k%(hop+1)==hop){ i.remove(); k=0; } k++; } System.out.println("剩下:"+d.head.right.item); } }
  • 约瑟夫问题
    1 引用 • 4 回帖
  • 链表
    12 引用 • 6 回帖
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3201 引用 • 8217 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • ss 1
    作者

    @88250 老大,为啥两篇文章少了一篇呢,那一篇《单循环链表》的不见了呢?

  • 88250

    @ss 昨天我看到了两个标题好像是一样的,就被我删除了,抱歉啊....

  • ss 1
    作者

    @88250 啊,原来啊。木事,再写一次就行了啊。不过建议老大给文章添加个状态啥的,如果觉得文章不太好的话,标记个状态,排名下降一点,然后通知用户检查一下,等待时间足够长的话用户没有反应然后移到垃圾箱。等待用户自己处理~

  • xcatliu 1 via macOS

    @88250 也可以用机器识别标题和内容是不是一样的。毕竟人总有犯错的时候……

推荐标签 标签

  • 外包

    有空闲时间是接外包好呢还是学习好呢?

    26 引用 • 233 回帖 • 5 关注
  • Gzip

    gzip (GNU zip)是 GNU 自由软件的文件压缩程序。我们在 Linux 中经常会用到后缀为 .gz 的文件,它们就是 Gzip 格式的。现今已经成为互联网上使用非常普遍的一种数据压缩格式,或者说一种文件格式。

    9 引用 • 12 回帖 • 179 关注
  • Android

    Android 是一种以 Linux 为基础的开放源码操作系统,主要使用于便携设备。2005 年由 Google 收购注资,并拉拢多家制造商组成开放手机联盟开发改良,逐渐扩展到到平板电脑及其他领域上。

    336 引用 • 324 回帖
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    268 引用 • 666 回帖 • 1 关注
  • 架构

    我们平时所说的“架构”主要是指软件架构,这是有关软件整体结构与组件的抽象描述,用于指导软件系统各个方面的设计。另外还有“业务架构”、“网络架构”、“硬件架构”等细分领域。

    142 引用 • 442 回帖 • 2 关注
  • 音乐

    你听到信仰的声音了么?

    62 引用 • 512 回帖
  • 服务器

    服务器,也称伺服器,是提供计算服务的设备。由于服务器需要响应服务请求,并进行处理,因此一般来说服务器应具备承担服务并且保障服务的能力。

    125 引用 • 585 回帖
  • 互联网

    互联网(Internet),又称网际网络,或音译因特网、英特网。互联网始于 1969 年美国的阿帕网,是网络与网络之间所串连成的庞大网络,这些网络以一组通用的协议相连,形成逻辑上的单一巨大国际网络。

    98 引用 • 367 回帖
  • ZooKeeper

    ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,是 Google 的 Chubby 一个开源的实现,是 Hadoop 和 HBase 的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

    60 引用 • 29 回帖 • 9 关注
  • FlowUs

    FlowUs.息流 个人及团队的新一代生产力工具。

    让复杂的信息管理更轻松、自由、充满创意。

    1 引用 • 4 关注
  • Ant-Design

    Ant Design 是服务于企业级产品的设计体系,基于确定和自然的设计价值观上的模块化解决方案,让设计者和开发者专注于更好的用户体验。

    17 引用 • 23 回帖 • 5 关注
  • Thymeleaf

    Thymeleaf 是一款用于渲染 XML/XHTML/HTML5 内容的模板引擎。类似 Velocity、 FreeMarker 等,它也可以轻易的与 Spring 等 Web 框架进行集成作为 Web 应用的模板引擎。与其它模板引擎相比,Thymeleaf 最大的特点是能够直接在浏览器中打开并正确显示模板页面,而不需要启动整个 Web 应用。

    11 引用 • 19 回帖 • 393 关注
  • Sphinx

    Sphinx 是一个基于 SQL 的全文检索引擎,可以结合 MySQL、PostgreSQL 做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用程序更容易实现专业化的全文检索。

    1 引用 • 227 关注
  • FreeMarker

    FreeMarker 是一款好用且功能强大的 Java 模版引擎。

    23 引用 • 20 回帖 • 466 关注
  • CloudFoundry

    Cloud Foundry 是 VMware 推出的业界第一个开源 PaaS 云平台,它支持多种框架、语言、运行时环境、云平台及应用服务,使开发人员能够在几秒钟内进行应用程序的部署和扩展,无需担心任何基础架构的问题。

    5 引用 • 18 回帖 • 194 关注
  • Flutter

    Flutter 是谷歌的移动 UI 框架,可以快速在 iOS 和 Android 上构建高质量的原生用户界面。 Flutter 可以与现有的代码一起工作,它正在被越来越多的开发者和组织使用,并且 Flutter 是完全免费、开源的。

    39 引用 • 92 回帖 • 9 关注
  • 小薇

    小薇是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动。

    由于 Smart QQ 从 2019 年 1 月 1 日起停止服务,所以该项目也已经停止维护了!

    35 引用 • 468 回帖 • 768 关注
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 5 关注
  • Dubbo

    Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,是 [阿里巴巴] SOA 服务化治理方案的核心框架,每天为 2,000+ 个服务提供 3,000,000,000+ 次访问量支持,并被广泛应用于阿里巴巴集团的各成员站点。

    60 引用 • 82 回帖 • 616 关注
  • TextBundle

    TextBundle 文件格式旨在应用程序之间交换 Markdown 或 Fountain 之类的纯文本文件时,提供更无缝的用户体验。

    1 引用 • 2 回帖 • 86 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 2 关注
  • etcd

    etcd 是一个分布式、高可用的 key-value 数据存储,专门用于在分布式系统中保存关键数据。

    6 引用 • 26 回帖 • 546 关注
  • Telegram

    Telegram 是一个非盈利性、基于云端的即时消息服务。它提供了支持各大操作系统平台的开源的客户端,也提供了很多强大的 APIs 给开发者创建自己的客户端和机器人。

    5 引用 • 35 回帖 • 1 关注
  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    77 引用 • 37 回帖
  • DevOps

    DevOps(Development 和 Operations 的组合词)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。

    59 引用 • 25 回帖 • 5 关注
  • RabbitMQ

    RabbitMQ 是一个开源的 AMQP 实现,服务器端用 Erlang 语言编写,支持多种语言客户端,如:Python、Ruby、.NET、Java、C、PHP、ActionScript 等。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。

    49 引用 • 60 回帖 • 350 关注
  • 资讯

    资讯是用户因为及时地获得它并利用它而能够在相对短的时间内给自己带来价值的信息,资讯有时效性和地域性。

    56 引用 • 85 回帖