双链集合添加删除算法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了双链集合添加删除算法相关的知识,希望对你有一定的参考价值。

双链集合添加删除算法:

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());
		}
		
	}
	
}

以上是关于双链集合添加删除算法的主要内容,如果未能解决你的问题,请参考以下文章

[算法]在单链表和双链表中删除倒数第k个结点

算法总结之 在单链表和双链表中删除倒数第k个节点

日常学习随笔-自定义了一个双链表(注释蛮详细的)

算法专区博文汇总

js数据结构学习双链表 集合

Ocaml双链表:从双链表中删除满足条件的节点