1. 程式人生 > >雙鏈集合添加刪除算法

雙鏈集合添加刪除算法

ddl list 集合 test 一個 ram keyword doc link

雙鏈集合添加刪除算法:

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

雙鏈集合添加刪除算法