雙鏈集合添加刪除算法
阿新 • • 發佈:2017-07-14
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());
}
}
}
雙鏈集合添加刪除算法