文档章节

双链集合添加删除算法

凯哥学堂
 凯哥学堂
发布于 2017/07/14 20:56
字数 789
阅读 2
收藏 0

双链集合添加删除算法:

package com.linkes;

public class MyLinkeList {
/**
 * 更多资料欢迎浏览凯哥学堂官网:http://kaige123.com
 * @author 小沫
 */
	/**
	 * 链表集合他是于双链条式进行引用上下家,好处可以知道上家和下家是谁
	 * 利于修改,可以从首部开始删除数据也可以从尾部删除。
	 * 即可从中间指定位置删除。
	 */
	private Object[] shou;
	private Object[] wei;

	// 默认添加方法
	public void add(Object obj) {
		if (shou == null) {
			//首部为空就new好空间第1个和第三个放null第二个放传递进来的数据
			shou = new Object[] { null, obj, null };
			wei = shou;//把尾部指向了首部
		} else {
			//如果首部有数据,那么就new好长度为3的空间
			//把wei放入第一个指向了上家,第二个放入当前的数据,第三个为NULL
			Object[] objs = new Object[] { wei, obj, null };
			wei[2] = objs;//尾部的第三个指向了objs
			wei = objs;//objs更新成尾部
		}
	}

	// 从最后面添加方法
	public void addlast(Object obj) {
		add(obj);
	}

	// 从最前面添加方法
	public void addFirst(Object obj) {
		if (shou == null) {
			shou = new Object[] { null, obj, null };
			wei = shou;
		} else {
			Object[] objs = new Object[] { null, obj, shou };
			shou[0] = objs;
			shou = objs;
		}
	}

	// 全部删除方法
	public void removeAll(int delAll) {
		if (delAll == 0) {
			wei = null;//直接制个空就全部删除了
			shou = null;
			System.out.println("清除完成");
		} else {
			try {
				throw new Exception("删除失败!delAll需为'0'");
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	// 从最后面删除方法
	public Object removeLast() {
		Object obj = null;
		
		if (wei == null) {//没有尾部那么直接返回false
			return false;
		}
		//请问有没有上家
		if (wei[0] == null) {
			//如果没有直接把尾跟首制空  因为没有上家意味着只有一个数据
			wei = null;
			shou = null;
		} else {
			//有上家那就把尾部1里面的数据交给obj
			obj = wei[1];
			wei = (Object[]) wei[0];//尾部指向了尾部的下标0
			wei[2] = null;
		}
		return obj;
	}

	// 从最前面删除方法
	public Object removeFirst() {
		Object obj = null;
		obj = shou[1];
		if (shou == null) {
			return false;
		}
		if (shou[2] == null) {
			wei = null;
			shou = null;
		} else {
			shou = (Object[]) shou[2];
			shou[0] = null;
		}
		return obj;
	}

	// 从中间删除方法
	public boolean remove(Object obj) {
		Object[] objs = shou;
		while (true) {//找上下家
			//传进来的数据是不是等于了objs当前的数据
			if (obj.equals(objs[1])) {
				break;//如果等于了那就是找到了跳出循环
			}
			//如果传进来的数据不是当前数据那么就列出下家
			objs = (Object[]) objs[2];
			if (objs == null) {//如果没有下家了那么就跳出循环
				break;
			}
		}
		if (objs == null) {
			return false;
		}
		if (objs == shou) {//问是不是删除首部
			removeFirst();
		} else if (objs == wei) {//是不是删除尾部
			removeLast();
		} else {
			//把当前数据拆分成上家和下家
			Object[] shang = (Object[]) objs[0];
			Object[] xia = (Object[]) objs[2];
			shang[2] = xia;//把上家的下标2引用了下家数据
			xia[0] = shang;//把下家的下标0引用了上家数据
		}
		return true;
	}

	private Object[] dq = null;
	//用hashNext一个个询问数据检索
	public boolean hashNext() {
		if (dq == null) {
			dq = shou;
			if (dq == null) {
				return false;
			}
			return true;
		}
		dq = (Object[]) dq[2];
		if (dq == null) {
			return false;
		}
		return true;
	}
	//用Next进行拿到值
	public Object Next() {
		return dq[1];
	}
}

测试类:

ackage com.linkes;

public class Test {

	public static void main(String[] args) {
		
		MyLinkeList linke = new MyLinkeList();
		
		linke.add("a");
		linke.addlast("b");
		linke.addFirst("c");
		linke.addFirst("d");
		linke.addFirst("e");
		linke.addFirst("f");
		linke.addFirst("g");
		
		linke.removeAll(1);
		
		
		while(linke.hashNext()){
			System.out.println(linke.Next());
		}
		
	}
	
}

© 著作权归作者所有

共有 人打赏支持
凯哥学堂
粉丝 17
博文 316
码字总数 284948
作品 0
东城
程序员
关于链表中哨兵结点问题的深入剖析

最近正在学习UC Berkeley的CS61B这门课,主要是采用Java语言去实现一些数据结构以及运用数据结构去做一些project。这门课不仅告诉你这个东西怎么做,而且一步一步探寻为什么要这样做以及为什...

xinyuexy
10/07
0
0
数据结构(集合和数组)

在使用JAVA的时候经常用到集合类(有时也称容器类),下面对常用的容器类进行一下总结。首先看一张图,了解一下集合类的结构以及他们之间的关系: 一、Collection接口 Collection接口是 Set 、...

微尘鉴
2016/02/22
40
0
一种改进的双链量子遗传算法及其应用

虽然该方法仍属传统遗传算法, 但激发了量子计算原理与遗传算法相结合的研究;Han等人[7]采用量子位编码和量子门更新染色体,提出了遗传量子算法和并行量子遗传算法, 并成功求解了组合优化问题;...

雪花又一年
05/15
0
0
设计并实现一个LRU Cache

一、什么是Cache 1 概念 Cache,即高速缓存,是介于CPU和内存之间的高速小容量存储器。在金字塔式存储体系中它位于自顶向下的第二层,仅次于CPU寄存器。其容量远小于内存,但速度却可以接近C...

汉克斯
2015/08/05
0
0
OC之NSSet/NSMutableSet

1、集合(NSSet)与数组(NSArray)比较: (1)都是存储不同的对象的地址 (2)NSArray是有序的集合,NSSet是无序的集合。 (3)集合是一种哈希表,运用散列算法,查找集合中的元素比数组速度...

feng_blog
2015/09/02
66
0

没有更多内容

加载失败,请刷新页面

加载更多

原型模式

1、原型模式-定义 用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象 克隆(浅度克隆->拷贝值类型或者引用,深度克隆->创建新的对象,开辟新的内存) 例如客户端知道抽象Pro...

阿元
今天
16
0
awk命令扩展使用操作

awk 中使用外部shell变量 示例1 [root@centos01 t1022]# A=888[root@centos01 t1022]# echo "" | awk -v GET_A=$A '{print GET_A}'888[root@centos01 t1022]# echo "aaaaaaaaaaaaa" | aw......

野雪球
今天
16
0
深入解析MySQL视图VIEW

Q:什么是视图?视图是干什么用的? A:视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。   通过视图,可以展现基表的部分数据;...

IT--小哥
今天
23
0
虚拟机学习之二:垃圾收集器和内存分配策略

1.对象是否可回收 1.1引用计数算法 引用计数算法:给对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加1;当引用失效时,计数器值就减1;任何时候计数器值为0的对象就是不可能...

贾峰uk
今天
14
0
smart-doc功能使用介绍

smart-doc从8月份底开始开源发布到目前为止已经迭代了几个版本。在这里非常感谢那些敢于用smart-doc去做尝试并积极提出建议的社区用户。因此决定在本博客中重要说明下smart-doc的功能,包括使...

上官胡闹
昨天
25
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部