实现一个链表和队列

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了实现一个链表和队列相关的知识,希望对你有一定的参考价值。

import java.text.SimpleDateFormat;
import java.util.Calendar;
import org.apache.log4j.Logger;

/*
 * 实现一个泛型链表类接口, 
1.链表增加一个节点,
2.指定位置增加一个节点
3.删除指定位置的节点
4.删除某种内容的所有节点

加上日志
 * */

public class LinkMe {

	public static void main(String args[]){
		
		//BasicConfigurator.configure ();
		//PropertyConfigurator.configure ( "D:/workspace/HomeWork/src/log4j.properties");
		
		MyLink<String> l = new MyLink<>("l","String");
		l.insertFirst("zhang san");
		l.insertFirst("li si");
		l.insertFirst("wang wu");
		l.insertFirst("zhao liu");
		l.printMyLink();
		l.del(4);
		l.printMyLink();
		
		l.insert(3, "new Man");
		l.printMyLink();
		
		l.delZD("li");
		l.printMyLink();
		
		System.out.println();
		MyLink<Integer> in = new MyLink<>("in","Integer");
		in.insertFirst(1);
		in.insertFirst(2);
		in.insertFirst(3);
		in.printMyLink();
		
		in.del(2);
		in.printMyLink();
		
		in.insert(2, 5);
		in.printMyLink();
	}
	
}

class MyLink<E>{
	
	Logger logger = Logger.getLogger(LinkMe.class.getName());
	private LinkData<E> first;
	private static int no;
	
	MyLink(String name,String lx){
		first = null;
		no=0;
		logger.debug("---------------------------------------");
		logger.debug(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Calendar.getInstance().getTime()));
		logger.debug("新建一个链表:"+name+",类型为"+lx);
	}
	
	public void insertFirst(E aName){     //每次在链表尾部插入
		LinkData<E> ld = new LinkData<>(aName);
		ld.setNext(first);
		first = ld;
		no++;
	}
	
	public void insert(int aI,E aName){  //指定位置插入节点
		int i = 1;
		LinkData<E> ld = new LinkData<>(aName);
		LinkData<E> t = first;
		logger.debug("在节点"+aI+"插入:"+ aName );
		if (aI == 1 || aI < 1) {
			insertFirst(aName);
		} else if(aI>no) {
			while(t.getNext()!=null){
				t = t.getNext();
			}
			t.setNext(ld);
			ld.setNext(null);
		} else {
			while(++i!=aI){
				t = t.getNext();
			}
			LinkData<E> tl = t ;
			ld.setNext(tl.getNext());
			t.setNext(ld);
		}
		no++;
	}
	
	public void delZD(String str){   //删除包含某种字符的所有节点
		LinkData<E> t = first;
		int i = 1;
		while(t.getNext()!=null){
			if(i==1&&((String)t.getName()).indexOf(str)!=-1){   //删除第一个
				first = first.getNext();
				t = first;
				no--;
			}
			i++;
			if(((String)t.getNext().getName()).indexOf(str)!=-1){     //删除非第一个
				t.setNext(t.getNext().getNext());
				no--;
			}else{
				t=t.getNext();
			}
		}
	}
	
	public void del(int aI){  //删除指定节点
		LinkData<E> t = first;
		int i = 1;
		boolean note = false;
		while(t.getNext()!=null){
			if(aI==1&&i==aI){   //删除第一个
				first = first.getNext();
				t = first;
				note=true;
				no--;
			}
			if(++i==aI){     //删除非第一个
				t.setNext(t.getNext().getNext());
				note=true;
				no--;
			}else{
				t=t.getNext();
			}
		}
		if(note){
			logger.debug("删除节点"+aI);
		}else{
			logger.debug("删除节点"+aI);
		}
	}
	
	public void printMyLink(){
		LinkData<E> t = first;
		String str = "";
		while(t!=null){
			str += t.getName()+",";
			t = t.getNext();
		}
		if(str!=""){
			logger.debug(str+"  共"+no+"个节点");
		}
	}
	
}

class LinkData<E>{    //定义节点
	
	private E name;
	private LinkData<E> next;
	
	LinkData(E aName){
		setName(aName);
	}

	public LinkData<E> getNext() {
		return next;
	}

	public void setNext(LinkData<E> next) {
		this.next = next;
	}

	public E getName() {
		return name;
	}

	public void setName(E aName) {
		this.name = aName;
	}
	
}

 

/*
 * 建一个队列类
 * */

public class QueueMe {
    
    public static void main(String args[]){
        
        QueueList q = new QueueList(7);
        q.insert("a");
        q.insert("b");
        q.insert("c");
        q.insert("d");
        q.insert("e");
        q.insert("f");
        q.printQueue();
        
        q.del();
        q.del();
        q.printQueue();
        
        q.insert("a1");
        q.insert("b1");
        q.printQueue();
        
        q.del();
        q.del();
        q.del();
        q.del();
        q.del();
        q.del();
        q.del();
        q.del();
        q.printQueue();
    }
    
}

class QueueList{
    
    public int font;
    public int rear;
    public int size;
    public int num;
    public String[] arr;
    
    QueueList(int aI){
        size = aI;
        arr = new String[size];
        font = 0;
        rear = 0;
        num = 0;
    }
    
    public void insert(String aI){
        if (!isFull()) {
            if(arr[size-1]!=null){   //到栈顶后从底下插入
                rear = 0;
            }
            arr[rear++] = aI;
            num++;
        }
    }
    
    public void del(){
        if(!isEmpty()){
            if (font==size) {
                font = 0;
            }
            arr[font] = null;
            font++;
            num--;
        }
    }
    
    public boolean isFull(){
        if(num>=size){
            System.out.println("queue is full,can not insert.");
            return true;
        }else{
            return false;
        }
    }
    
    public boolean isEmpty(){
        if(num==0){
            System.out.println("queue is null,can not del.");
            return true;
        }else{
            return false;
        }
    }
    
    public void printQueue(){
        for(String i:arr)System.out.print(i+" ");
        System.out.println();
    }
    
}

 

以上是关于实现一个链表和队列的主要内容,如果未能解决你的问题,请参考以下文章

队列的实现方式(链表和数组)

6链表和数组,哪个实现队列更快?

Java栈[数组,单链表],队列数组,链表和循环队列的实现

C中线性表和链表的区别

双端链表和双向链表的区别

C++容器适配器实现队列Queue的各种功能(入队出队判空大小访问所有元素等)