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

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

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

添加元素的时间复杂度为 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 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3205 引用 • 8217 回帖

相关帖子

欢迎来到这里!

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

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

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

  • 88250

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

  • ss 1
    作者

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

  • xcatliu 1 via macOS

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

推荐标签 标签

  • WebComponents

    Web Components 是 W3C 定义的标准,它给了前端开发者扩展浏览器标签的能力,可以方便地定制可复用组件,更好的进行模块化开发,解放了前端开发者的生产力。

    1 引用 • 20 关注
  • 安装

    你若安好,便是晴天。

    132 引用 • 1184 回帖 • 1 关注
  • 微软

    微软是一家美国跨国科技公司,也是世界 PC 软件开发的先导,由比尔·盖茨与保罗·艾伦创办于 1975 年,公司总部设立在华盛顿州的雷德蒙德(Redmond,邻近西雅图)。以研发、制造、授权和提供广泛的电脑软件服务业务为主。

    8 引用 • 44 回帖
  • Visio
    1 引用 • 2 回帖
  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 555 关注
  • 服务器

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

    125 引用 • 585 回帖 • 1 关注
  • 域名

    域名(Domain Name),简称域名、网域,是由一串用点分隔的名字组成的 Internet 上某一台计算机或计算机组的名称,用于在数据传输时标识计算机的电子方位(有时也指地理位置)。

    43 引用 • 208 回帖
  • Flume

    Flume 是一套分布式的、可靠的,可用于有效地收集、聚合和搬运大量日志数据的服务架构。

    9 引用 • 6 回帖 • 671 关注
  • JRebel

    JRebel 是一款 Java 虚拟机插件,它使得 Java 程序员能在不进行重部署的情况下,即时看到代码的改变对一个应用程序带来的影响。

    26 引用 • 78 回帖 • 696 关注
  • 禅道

    禅道是一款国产的开源项目管理软件,她的核心管理思想基于敏捷方法 scrum,内置了产品管理和项目管理,同时又根据国内研发现状补充了测试管理、计划管理、发布管理、文档管理、事务管理等功能,在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来,完整地覆盖了项目管理的核心流程。

    10 引用 • 15 回帖 • 2 关注
  • C++

    C++ 是在 C 语言的基础上开发的一种通用编程语言,应用广泛。C++ 支持多种编程范式,面向对象编程、泛型编程和过程化编程。

    108 引用 • 153 回帖
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    92 引用 • 752 回帖
  • 机器学习

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

    77 引用 • 37 回帖
  • 爬虫

    网络爬虫(Spider、Crawler),是一种按照一定的规则,自动地抓取万维网信息的程序。

    106 引用 • 275 回帖 • 1 关注
  • Love2D

    Love2D 是一个开源的, 跨平台的 2D 游戏引擎。使用纯 Lua 脚本来进行游戏开发。目前支持的平台有 Windows, Mac OS X, Linux, Android 和 iOS。

    14 引用 • 53 回帖 • 563 关注
  • Notion

    Notion - The all-in-one workspace for your notes, tasks, wikis, and databases.

    10 引用 • 80 回帖
  • 工具

    子曰:“工欲善其事,必先利其器。”

    305 引用 • 772 回帖
  • Tomcat

    Tomcat 最早是由 Sun Microsystems 开发的一个 Servlet 容器,在 1999 年被捐献给 ASF(Apache Software Foundation),隶属于 Jakarta 项目,现在已经独立为一个顶级项目。Tomcat 主要实现了 JavaEE 中的 Servlet、JSP 规范,同时也提供 HTTP 服务,是市场上非常流行的 Java Web 容器。

    162 引用 • 529 回帖 • 7 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 691 关注
  • React

    React 是 Facebook 开源的一个用于构建 UI 的 JavaScript 库。

    192 引用 • 291 回帖 • 360 关注
  • H2

    H2 是一个开源的嵌入式数据库引擎,采用 Java 语言编写,不受平台的限制,同时 H2 提供了一个十分方便的 web 控制台用于操作和管理数据库内容。H2 还提供兼容模式,可以兼容一些主流的数据库,因此采用 H2 作为开发期的数据库非常方便。

    11 引用 • 54 回帖 • 681 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    32 引用 • 108 回帖
  • OneDrive
    2 引用 • 1 关注
  • Quicker

    Quicker 您的指尖工具箱!操作更少,收获更多!

    39 引用 • 167 回帖 • 3 关注
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 384 回帖
  • 旅游

    希望你我能在旅途中找到人生的下一站。

    104 引用 • 908 回帖 • 1 关注
  • 分享

    有什么新发现就分享给大家吧!

    249 引用 • 1799 回帖