双链集合添加删除算法:
packagecom.linkes;publicclassMyLinkeList{/** * 更多资料欢迎浏览凯哥学堂官网:http://kaige123.com *@author小沫 *//**
* 链表集合他是于双链条式进行引用上下家,好处可以知道上家和下家是谁
* 利于修改,可以从首部开始删除数据也可以从尾部删除。
* 即可从中间指定位置删除。
*/privateObject[] shou;privateObject[] wei;// 默认添加方法publicvoidadd(Object obj){if(shou ==null) {//首部为空就new好空间第1个和第三个放null第二个放传递进来的数据shou =newObject[] {null, obj,null};wei = shou;//把尾部指向了首部}else{//如果首部有数据,那么就new好长度为3的空间//把wei放入第一个指向了上家,第二个放入当前的数据,第三个为NULLObject[] objs =newObject[] { wei, obj,null};wei[2] = objs;//尾部的第三个指向了objswei = objs;//objs更新成尾部}}// 从最后面添加方法publicvoidaddlast(Object obj){add(obj);}// 从最前面添加方法publicvoidaddFirst(Object obj){if(shou ==null) {shou =newObject[] {null, obj,null};wei = shou;}else{Object[] objs =newObject[] {null, obj, shou };shou[0] = objs;shou = objs;}}// 全部删除方法publicvoidremoveAll(intdelAll){if(delAll ==0) {wei =null;//直接制个空就全部删除了shou =null;System.out.println("清除完成");}else{try{thrownewException("删除失败!delAll需为'0'");}catch(Exception e) {e.printStackTrace();}}}// 从最后面删除方法publicObjectremoveLast(){Object obj =null;if(wei ==null) {//没有尾部那么直接返回falsereturnfalse;}//请问有没有上家if(wei[0] ==null) {//如果没有直接把尾跟首制空 因为没有上家意味着只有一个数据wei =null;shou =null;}else{//有上家那就把尾部1里面的数据交给objobj = wei[1];wei = (Object[]) wei[0];//尾部指向了尾部的下标0wei[2] =null;}returnobj;}// 从最前面删除方法publicObjectremoveFirst(){Object obj =null;obj = shou[1];if(shou ==null) {returnfalse;}if(shou[2] ==null) {wei =null;shou =null;}else{shou = (Object[]) shou[2];shou[0] =null;}returnobj;}// 从中间删除方法publicbooleanremove(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) {returnfalse;}if(objs == shou) {//问是不是删除首部removeFirst();}elseif(objs == wei) {//是不是删除尾部removeLast();}else{//把当前数据拆分成上家和下家Object[] shang = (Object[]) objs[0];Object[] xia = (Object[]) objs[2];shang[2] = xia;//把上家的下标2引用了下家数据xia[0] = shang;//把下家的下标0引用了上家数据}returntrue;}privateObject[] dq =null;//用hashNext一个个询问数据检索publicbooleanhashNext(){if(dq ==null) {dq = shou;if(dq ==null) {returnfalse;}returntrue;}dq = (Object[]) dq[2];if(dq ==null) {returnfalse;}returntrue;}//用Next进行拿到值publicObjectNext(){returndq[1];}}
ackage com.linkes;publicclassTest{publicstaticvoidmain(String[] args){MyLinkeList linke =newMyLinkeList();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());}}}