循环链表
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 + " ");
}
}
}
分享到:
相关推荐
教材和相关的阅读材料中对读者写者问题算法均有描述,但这个算法在不断地有读者流的情况下,写者会被阻塞。编写一个写者优先解决读者写者问题的程序,其中读者和写者均是多个进程,用信号量作为同步互斥机制。
二、 善于引导面试官,比如当面试官问到什么问题不懂的时候,避免连问几个都不懂,可以尝试这么说:我***方面的知识比较匮乏,不是很了解,但是我对***的知识还是比较熟习,我觉得***的知识在我们华为性能与算法...
这样一本C语言的入门书籍,从hello world开始讲起,却在短小的篇幅里,手把手教你写了stdio.h stdlib.h string.h当中大部分例程,实现了二分查找、快速排序、二叉树、哈希表这些重要的数据结构和算法。甚至为了解释...
能自己编写内核程序并不意味着可以读懂内核,虽然反过来是一定成立的。读懂别人编写的没有代码的程序,比自己编写更困难一些,但的确是值得的。 第8章 进入Windows内核 96 8.1 开始Windows内核编程 97 8.1.1 ...
调整了程序中关卡对于胜利和失败的算法 几个植物和僵尸做了调整 修改了几个BUG 2010.12.27 对初始界面稍作修改 2010.12.9 添加了“靠天吃饭”小游戏 给领带僵尸添加两种形象 修正辣椒爆炸图片的问题 ...
另外,ADO方式写二进制数据到表里,速度确实太慢了。当时得能力有限,很多代码未很好得设计,可以重构得地方很多,程序可以给初学者作为参考。//////////InfoBase 0.2 Beta Build 20031119开发日志这是我续 ...
第二部分:深入分析进程创建的写时拷贝技术、以及Linux的线程究竟是怎么回事(为什么称为轻量级进程),此部分也会搞清楚进程0、进程1和托孤,以及睡眠时的等待队列;第三部分:搞清楚Linux进程调度算法,不同的调度...
能自己编写内核程序并不意味着可以读懂内核,虽然反过来是一定成立的。读懂别人编写的没有代码的程序,比自己编写更困难一些,但的确是值得的。 第8章 进入Windows内核 第9章 用C++编写的内核程序 第10章 继续探索...
能自己编写内核程序并不意味着可以读懂内核,虽然反过来是一定成立的。读懂别人编写的没有代码的程序,比自己编写更困难一些,但的确是值得的。 第8章 进入Windows内核 96 8.1 开始Windows内核编程 97 8.1.1 ...
能自己编写内核程序并不意味着可以读懂内核,虽然反过来是一定成立的。读懂别人编写的没有代码的程序,比自己编写更困难一些,但的确是值得的。 第8章 进入Windows内核 96 8.1 开始Windows内核编程 97 8.1.1 ...
忽略大小写Replace效率瓶颈IndexOf 随机排列算法 理解C#中的委托[翻译] 利用委托机制处理.NET中的异常 与正则表达式相关的几个小工具 你真的了解.NET中的String吗? .NET中的方法及其调用(一) 如何判断ArrayList,...
例如正在写的数据以后可能被另一个线程读到,或者正在读的数据可能已经被另一个线程写过了,那么这些数据就是共享数据,必须进行同步存取。 当应用程序在对象上调用了一个需要花费很长时间来执行的方法,并且不希望...
抽象包括两个方面,一是过程抽象,二是数据抽象。 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法。对象的一个新类可以从现有的类中派生,这个过程称为类继承。新类...
用户可以实现这写接口的某些或全部方法,达到载 运行期内某些状态的监控。 Spider监控:com.sosoo.robot.spider.RobotCallback 主要提供文档的处理,spider的睡眠,spider当前任务的监控。 void ...