zoukankan      html  css  js  c++  java
  • 双链集合添加删除算法

    双链集合添加删除算法:

    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());
    		}
    		
    	}
    	
    }
  • 相关阅读:
    MySQL管理工具-SQLyog 9.63的使用详解
    通讯录管理系统
    Mavenx学习找对方法,快速上手!
    晚风花间寺中人
    PE重装系统,U盘重装系统,一步到位,重装无忧!
    进入博客园的第一篇随笔,贡献给我最喜欢的作家-大冰
    天地有情尽白发,人间无意了沧桑
    狼和羊的故事(安徒生新篇)
    .Net Core CLR GC的浅度分析
    .net core 的夸代扫描标记card_table的细节分析
  • 原文地址:https://www.cnblogs.com/kaigexuetang/p/7172190.html
Copyright © 2011-2022 走看看