@Override
	public void remove(T t) {
		DInfo<T> op;
		SearchReturnValues ret;
		LockFreeNode<T> newNode=new LockFreeNode<T>(t);//node to find

		while(true){
			ret=search(newNode);
			if(newNode.compareTo(ret.l)!=0){
				//In case something change during the search and 
				// we miss the element, we try it again one more time.
				ret=search(newNode);
				if(newNode.compareTo(ret.l)!=0){
					return;
				}
			}
			if(!ret.gsi.isClean())
				Help(ret.gsi);
			else if(!ret.si.isClean())
				Help(ret.si);
			else{
				boolean res;
				op= new DInfo<T>(ret.gp,ret.p,ret.l,ret.si,ret.stamps);
				StateInfo<T> newStateInfo = new StateInfo<T>(StateInfo.DFlag,op);
				res=ret.gp.si.compareAndSet(ret.gsi, newStateInfo , op.stamps.gsiStamp, ++op.stamps.gsiStamp);
				if(res){
					if(HelpDelete(op))
						return;
				}else{
					Help(ret.gp.si.getReference());						
				}
			}
		}
	}