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

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

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

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

    3169 引用 • 8207 回帖

相关帖子

欢迎来到这里!

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

注册 关于
请输入回帖内容 ...
  • 88250

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

  • 其他回帖
  • xcatliu 1

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

  • ss 1
    作者

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

  • ss 1
    作者

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

推荐标签 标签

  • Hprose

    Hprose 是一款先进的轻量级、跨语言、跨平台、无侵入式、高性能动态远程对象调用引擎库。它不仅简单易用,而且功能强大。你无需专门学习,只需看上几眼,就能用它轻松构建分布式应用系统。

    9 引用 • 17 回帖 • 604 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • Thymeleaf

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

    11 引用 • 19 回帖 • 318 关注
  • Angular

    AngularAngularJS 的新版本。

    26 引用 • 66 回帖 • 511 关注
  • AngularJS

    AngularJS 诞生于 2009 年,由 Misko Hevery 等人创建,后为 Google 所收购。是一款优秀的前端 JS 框架,已经被用于 Google 的多款产品当中。AngularJS 有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、语义化标签、依赖注入等。2.0 版本后已经改名为 Angular。

    12 引用 • 50 回帖 • 432 关注
  • danl
    76 关注
  • Sillot

    汐洛彖夲肜矩阵(Sillot T☳Converbenk Matrix),致力于服务智慧新彖乄,具有彖乄驱动、极致优雅、开发者友好的特点。其中汐洛绞架(Sillot-Gibbet)基于自思源笔记(siyuan-note),前身是思源笔记汐洛版(更早是思源笔记汐洛分支),是智慧新录乄终端(多端融合,移动端优先)。
    项目 Github 地址:https://github.com/Hi-Windom/Sillot ,点个免费的 ⭐ 收藏是汐洛更新的最大动力。

    注意事项:

    1. ⚠️ 汐洛仍在早期开发阶段,尚不稳定
    2. ⚠️ 汐洛并非面向普通用户设计,使用前请了解风险
    23 引用 • 17 回帖 • 42 关注
  • OnlyOffice
    4 引用 • 18 关注
  • 大疆创新

    深圳市大疆创新科技有限公司(DJI-Innovations,简称 DJI),成立于 2006 年,是全球领先的无人飞行器控制系统及无人机解决方案的研发和生产商,客户遍布全球 100 多个国家。通过持续的创新,大疆致力于为无人机工业、行业用户以及专业航拍应用提供性能最强、体验最佳的革命性智能飞控产品和解决方案。

    2 引用 • 14 回帖 • 1 关注
  • 创造

    你创造的作品可能会帮助到很多人,如果是开源项目的话就更赞了!

    174 引用 • 990 回帖
  • Markdown

    Markdown 是一种轻量级标记语言,用户可使用纯文本编辑器来排版文档,最终通过 Markdown 引擎将文档转换为所需格式(比如 HTML、PDF 等)。

    165 引用 • 1461 回帖
  • CentOS

    CentOS(Community Enterprise Operating System)是 Linux 发行版之一,它是来自于 Red Hat Enterprise Linux 依照开放源代码规定释出的源代码所编译而成。由于出自同样的源代码,因此有些要求高度稳定的服务器以 CentOS 替代商业版的 Red Hat Enterprise Linux 使用。两者的不同在于 CentOS 并不包含封闭源代码软件。

    238 引用 • 224 回帖
  • 强迫症

    强迫症(OCD)属于焦虑障碍的一种类型,是一组以强迫思维和强迫行为为主要临床表现的神经精神疾病,其特点为有意识的强迫和反强迫并存,一些毫无意义、甚至违背自己意愿的想法或冲动反反复复侵入患者的日常生活。

    15 引用 • 161 回帖
  • Facebook

    Facebook 是一个联系朋友的社交工具。大家可以通过它和朋友、同事、同学以及周围的人保持互动交流,分享无限上传的图片,发布链接和视频,更可以增进对朋友的了解。

    4 引用 • 15 回帖 • 454 关注
  • 互联网

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

    96 引用 • 330 回帖
  • jsDelivr

    jsDelivr 是一个开源的 CDN 服务,可为 npm 包、GitHub 仓库提供免费、快速并且可靠的全球 CDN 加速服务。

    5 引用 • 31 回帖 • 50 关注
  • 尊园地产

    昆明尊园房地产经纪有限公司,即:Kunming Zunyuan Property Agency Company Limited(简称“尊园地产”)于 2007 年 6 月开始筹备,2007 年 8 月 18 日正式成立,注册资本 200 万元,公司性质为股份经纪有限公司,主营业务为:代租、代售、代办产权过户、办理银行按揭、担保、抵押、评估等。

    1 引用 • 22 回帖 • 689 关注
  • BAE

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

    19 引用 • 75 回帖 • 618 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 180 关注
  • 电影

    这是一个不能说的秘密。

    120 引用 • 597 回帖 • 1 关注
  • 面试

    面试造航母,上班拧螺丝。多面试,少加班。

    324 引用 • 1395 回帖 • 1 关注
  • Sublime

    Sublime Text 是一款可以用来写代码、写文章的文本编辑器。支持代码高亮、自动完成,还支持通过插件进行扩展。

    10 引用 • 5 回帖
  • Ngui

    Ngui 是一个 GUI 的排版显示引擎和跨平台的 GUI 应用程序开发框架,基于
    Node.js / OpenGL。目标是在此基础上开发 GUI 应用程序可拥有开发 WEB 应用般简单与速度同时兼顾 Native 应用程序的性能与体验。

    7 引用 • 9 回帖 • 344 关注
  • 大数据

    大数据(big data)是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合,是需要新处理模式才能具有更强的决策力、洞察发现力和流程优化能力的海量、高增长率和多样化的信息资产。

    89 引用 • 113 回帖 • 1 关注
  • PWA

    PWA(Progressive Web App)是 Google 在 2015 年提出、2016 年 6 月开始推广的项目。它结合了一系列现代 Web 技术,在网页应用中实现和原生应用相近的用户体验。

    14 引用 • 69 回帖 • 135 关注
  • ActiveMQ

    ActiveMQ 是 Apache 旗下的一款开源消息总线系统,它完整实现了 JMS 规范,是一个企业级的消息中间件。

    19 引用 • 13 回帖 • 634 关注
  • 友情链接

    确认过眼神后的灵魂连接,站在链在!

    24 引用 • 373 回帖 • 1 关注