双链集合添加删除算法
2017-07-14 00:00
281 查看
双链集合添加删除算法:
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()); } } }
相关文章推荐
- C# 添加,修改,删除文件夹/文件集合
- C# 添加,修改,删除文件夹/文件集合
- 通过编码分别测试ArrayList 和 LinkedList 添加、删除对象时的耗时情况(精确到纳秒),并总结出以上两种集合的数据结构的不同之处。
- 在list集合中的添加、修改、删除和遍历元素
- Python 集合set添加删除、交集、并集、集合操作符号
- 《Delphi 算法与数据结构》学习与感悟[8]: 单向链表的添加、删除与遍历
- Python--Python 集合set()添加删除、交集、并集、集合
- 一步一步写算法(之图添加和删除)
- Python 集合set添加删除、交集、并集、集合操作符号
- 创建一个ArrayList集合,先往集合中添加1....50 这50个整数后,再删除集合中的所有奇数。
- C# 添加,修改,删除文件夹/文件集合
- C# 添加,修改,删除文件夹/文件集合
- C# 添加,修改,删除文件夹/文件集合
- 通过编码分别测试ArrayList 和 LinkedList 添加、删除对象时的耗时情况(精确到纳秒),并总结出以上两种集合的数据结构的不同之处。
- JAVA循环迭代中删除或添加集合数据报java.util.ConcurrentModificationException错误
- C# 添加,修改,删除文件夹/文件集合
- C# 添加,修改,删除文件夹/文件集合
- C# 添加,修改,删除文件夹/文件集合
- mongodb 集合创建、集合数据添加和集合删除
- java集合包总结(添加、删除等操作实现原理)