`
henry2009
  • 浏览: 90909 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

睡不着写算法(二)

    博客分类:
  • java
阅读更多

循环链表

package algorithms;

/**
 * 链表
 * @author henry
 * @date 2010-06-04  1:06:22
 */
public class MyLinkedList {

	private static MyNode myNode;
	private static int size = 0;

	public MyLinkedList() {
		// TODO Auto-generated constructor stub
		myNode = new MyNode();
	}

	/**
	 * 插入链表
	 * @param obj
	 */
	public void put(Object obj) {
		if(size == 0) {
			myNode.header = myNode;
			myNode.put(obj);
			myNode.next = myNode;
			size++;
			return;
		}
		
		MyNode node = new MyNode();
		node.header = myNode.header;
		node.put(obj);
		node.next = myNode;
		
		myNode.header.next = node;
		myNode.header = node;
		size++;
	}

	/**
	 * 获取链表大小
	 * @return
	 */
	public int size() {
		return size;
	}

	/**
	 * 正向获取
	 * @param idx
	 * @return
	 */
	public Object get(int idx) {
		if(idx >= size) {
			throw new OutOfMemoryError();
		}
		MyNode mn = myNode;
		Object obj = null;
		for(int i = 0; i < size; i++) {
			if(i == idx) {
				obj = mn.get();
				break;
			}
			
			mn = mn.next;
		}
		
		return obj;
	}

	/**
	 * 正向删除
	 * @param idx
	 * @return
	 */
	public Object remove(int idx) {
		if(idx >= size) {
			throw new OutOfMemoryError();
		}
		MyNode mn = myNode;
		Object obj = null;
		if(idx == 0) {
			obj = mn.get();
			mn.next.header = mn.header;
			myNode = mn.next;
			mn = null;
			size--;
			
			return obj;
		}
		
		for(int i = 0; i < size; i++) {
			if(i == idx) {
				obj = mn.get();
				mn.header.next = mn.next;
				mn.next.header = mn.header;
				size--;
				mn = null;
				break;
			}
			mn = mn.next;
		}
		
		return obj;
	}
	
	/**
	 * 反向删除链表
	 * @param idx
	 * @return
	 */
	public Object reverse(int idx) {
		if(idx >= size) {
			throw new OutOfMemoryError();
		}
		MyNode mn = myNode.header;
		Object obj = null;
		
		if(idx == 0) {
			obj = mn.get();
			myNode.header = mn.header;
			mn.header.next = mn.header;
			mn = null;
			size--;
			return obj;
		}
		
		for(int i = 0; i < size; i++) {
			if(i == idx) {
				obj = mn.get();
				mn.header.next = mn.next;
				mn.next.header = mn.header;
				size--;
				mn = null;
				break;
			}
			mn = mn.header;
		}
		
		return obj;
	}
	
	/**
	 * 反向链表
	 * @param idx
	 * @return
	 */
	public Object getReverse(int idx) {
		if(idx >= size) {
			throw new OutOfMemoryError();
		}
		MyNode mn = myNode.header;
		Object obj = null;
		for(int i = 0; i < size; i++) {
			if(i == idx) {
				obj = mn.get();
				break;
			}
			
			mn = mn.header;
		}
		
		return obj;
		
	}

	private static class MyNode {

		private MyNode header;
		private Object obj;
		private MyNode next;

		public MyNode() {
			// TODO Auto-generated constructor stub
			header = null;
			obj = null;
			next = null;
		}

		public void put(Object o) {
			obj = o;
		}
		
		public Object get() {
			return this.obj;
		}
	}
	
	public static void main(String[] args) {
		MyLinkedList mll = new MyLinkedList();
		for(int i = 0; i < 10; i++) {
			mll.put(i + "");
		}
		
		for(int i = 0; i < mll.size(); i++) {
			String a = (String) mll.get(i);
			System.out.print(a + " ");
		}
		
		System.out.println();
		System.out.println("删除前的大小:" + mll.size());
		
		System.out.println(mll.remove(0));
		System.out.println(mll.size());
		
		for(int i = 0; i < mll.size(); i++) {
			String a = (String) mll.get(i);
			System.out.print(a + " ");
		}
		
		System.out.println();
		
		System.out.println(mll.reverse(5));
		System.out.println(mll.size());
		
		for(int i = 0; i < mll.size(); i++) {
			String a = (String) mll.getReverse(i);
			System.out.print(a + " ");
		}
	}
}
0
3
分享到:
评论

相关推荐

    操作系统实验二:进程、线程之间的同步

    教材和相关的阅读材料中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。

    华为各轮面试总结 性能算法岗位

    二、 善于引导面试官,比如当面试官问到什么问题不懂的时候,避免连问几个都不懂,可以尝试这么说:我***方面的知识比较匮乏,不是很了解,但是我对***的知识还是比较熟习,我觉得***的知识在我们华为性能与算法...

    THE C PROGRAMMING LANGUAGE,2nd(ENGLISH TEXT VERSION)

    这样一本C语言的入门书籍,从hello world开始讲起,却在短小的篇幅里,手把手教你写了stdio.h stdlib.h string.h当中大部分例程,实现了二分查找、快速排序、二叉树、哈希表这些重要的数据结构和算法。甚至为了解释...

    天书夜读:从汇编语言到Windows内核编程(完整版 二)

    能自己编写内核程序并不意味着可以读懂内核,虽然反过来是一定成立的。读懂别人编写的没有代码的程序,比自己编写更困难一些,但的确是值得的。  第8章 进入Windows内核 96  8.1 开始Windows内核编程 97  8.1.1 ...

    植物大战僵尸HTML5源码

    调整了程序中关卡对于胜利和失败的算法 几个植物和僵尸做了调整 修改了几个BUG 2010.12.27 对初始界面稍作修改 2010.12.9 添加了“靠天吃饭”小游戏 给领带僵尸添加两种形象 修正辣椒爆炸图片的问题 ...

    InfoBase 资料管理库

    另外,ADO方式写二进制数据到表里,速度确实太慢了。当时得能力有限,很多代码未很好得设计,可以重构得地方很多,程序可以给初学者作为参考。//////////InfoBase 0.2 Beta Build 20031119开发日志这是我续 ...

    打通Linux脉络系列:进程、线程和调度

    第二部分:深入分析进程创建的写时拷贝技术、以及Linux的线程究竟是怎么回事(为什么称为轻量级进程),此部分也会搞清楚进程0、进程1和托孤,以及睡眠时的等待队列;第三部分:搞清楚Linux进程调度算法,不同的调度...

    从汇编语言到Windows内核编程

    能自己编写内核程序并不意味着可以读懂内核,虽然反过来是一定成立的。读懂别人编写的没有代码的程序,比自己编写更困难一些,但的确是值得的。 第8章 进入Windows内核 第9章 用C++编写的内核程序 第10章 继续探索...

    天书夜读:从汇编语言到Windows内核编程(完整版一)

    能自己编写内核程序并不意味着可以读懂内核,虽然反过来是一定成立的。读懂别人编写的没有代码的程序,比自己编写更困难一些,但的确是值得的。  第8章 进入Windows内核 96  8.1 开始Windows内核编程 97  8.1.1 ...

    天书夜谈:从汇编语言到Windows内核编程

    能自己编写内核程序并不意味着可以读懂内核,虽然反过来是一定成立的。读懂别人编写的没有代码的程序,比自己编写更困难一些,但的确是值得的。  第8章 进入Windows内核 96  8.1 开始Windows内核编程 97  8.1.1 ...

    asp.net知识库

    忽略大小写Replace效率瓶颈IndexOf 随机排列算法 理解C#中的委托[翻译] 利用委托机制处理.NET中的异常 与正则表达式相关的几个小工具 你真的了解.NET中的String吗? .NET中的方法及其调用(一) 如何判断ArrayList,...

    超级有影响力霸气的Java面试题大全文档

    例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望...

    java 面试题 总结

    抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类...

    Sosoo 1.0网络爬虫程序.doc

    用户可以实现这写接口的某些或全部方法,达到载 运行期内某些状态的监控。 Spider监控:com.sosoo.robot.spider.RobotCallback 主要提供文档的处理,spider的睡眠,spider当前任务的监控。 void ...

Global site tag (gtag.js) - Google Analytics