JAVA数据结构链表增删改查及堆栈

版权声明:版权声明:本文为博主原创文章,博客地址:http://blog.csdn.net/qq_37808895,未经博主允许不得转载。 https://blog.csdn.net/qq_37808895/article/details/88624170

结点类

public class Node<T> {
	public T data;
	public Node<T> next;
	public Node(T data,Node<T> next){
		this.data=data;
		this.next=next;
	}
	public Node(){
		this(null,null);
	}
	public String toString(){
		return this.data.toString();
	}
}

单链表

public class SinglyList<T> extends Object{
	public Node<T> head;
	public SinglyList(){
		this.head=new Node<T>();
	}
	public SinglyList(T[] values){
		this();
		Node<T> rear=this.head;
		for(int i=0;i<values.length;i++){
			rear.next=new Node<T>(values[i],null);
			rear=rear.next;
		}
	}
	public boolean isEmpty(){
		return this.head.next==null;
	}
	public T get(int i){
		Node<T> p=this.head.next;
		for(int j=0;p!=null&&j<i;j++)
				p=p.next;
		return (i>=0&&p!=null)?p.data:null;
	}
	public void set(int i,T x){
		if (x==null)
            throw new NullPointerException("x==null");    
        Node<T> p=this.head.next;
        for (int j=0; p!=null && j<i; j++)                
            p = p.next;
        if (i>=0 && p!=null)
            p.data = x;                                   
        else throw new IndexOutOfBoundsException(i+""); 
	}
	public int size(){   
		int i=0; 
		for (Node<T> p=this.head.next;  p!=null;  p=p.next) 
			i++;
    	return i;
    }
	public Node<T> insert(int i, T x)
    {
        if (x==null)
            throw new NullPointerException("x==null");     
        Node<T> front=this.head;                           
        for (int j=0;  front.next!=null && j<i;  j++)      
            front = front.next;
        front.next = new Node<T>(x, front.next);           
        return front.next;                                 
    }
	public Node<T> insert(T x)                             
    {
        return insert(Integer.MAX_VALUE, x);
                                             
    }
	
	public T remove(int i)    
    {
        Node<T> front=this.head;                           
        for (int j=0;  front.next!=null && j<i;  j++)      
            front = front.next;
        if (i>=0 && front.next!=null)                     
        {
            T old = front.next.data;                       
            front.next = front.next.next;                  
                                                           
            return old;
        }
        return null;                                       

    }
	
	public T find(int i)    
    {
        Node<T> front=this.head;                           
        for (int j=0;  front.next!=null && j<i;  j++)      
            front = front.next;
        if (i>=0 && front.next!=null)                     
        {
            T old = front.next.data;                                                                                      
            return old;
        }
        return null;                                       

    }

    public void clear()                                    
    {
        this.head.next=null;                               
    }
    
    public Node<T> search(T key) 
    {
        for (Node<T> p=this.head.next;  p!=null;  p=p.next)
            if (key.equals(p.data))                        
                return p;
        return null;
    }

    public boolean contains(T key)               
    {
        return this.search(key)!=null;                     
    }
    
    public Node<T> insertDifferent(T x)
    {
        Node<T> front=this.head, p=front.next;             //front是p的前驱结点
        while (p!=null && !p.data.equals(x))               //顺序查找
        {
            front = p; 
            p = p.next;
        }
        if (p!=null)                                       //查找成功,元素重复,不插入,返回p结点
        {
            System.out.println("x="+x+",元素重复,未插入。");
            return p;
        }
        return front.next = new Node<T>(x,null);           //尾插入值为x结点,返回插入结点
    }
    
    public T remove(T key)             //删除首个与key相等元素结点,返回被删除元素;查找不成功返回null
    {
        Node<T> front=this.head, p=front.next;
        while (p!=null && !key.equals(p.data))             
        {
            front = p;                                     
            p=p.next;
        }
        if (p!=null)                                       
        {
            front.next = p.next;                           
            return p.data;
        }
        return null;
    }
    
    public SinglyList(SinglyList<T> list)                  //深拷贝构造方法,复制单链表list的所有结点
    {
        this();                                            //创建空单链表,只有头结点
        Node<T> rear=this.head;
        for (Node<T> p=list.head.next;  p!=null;  p=p.next)  //p遍历list单链表
        {
            rear.next = new Node<T>(p.data, null);        //复制结点尾插入到this单链表
            rear = rear.next;                             //指向this单链表尾
        }
    }
    
    public boolean equals(Object obj)            //比较两条单链表是否相等,覆盖Object类的equals(obj)方法
    {
        if (obj == this)
            return true;
        if (!(obj instanceof SinglyList<?>))
            return false;
        Node<T> p=this.head.next;
        Node<T> q=((SinglyList<T>)obj).head.next;
        while (p!=null && q!=null && p.data.equals(q.data))
        {
            p=p.next;
            q=q.next;
        }
        return p==null && q==null;
    }   

	public String toString(){
		String str=this.getClass().getName()+"(";
		for(Node<T> p=this.head.next;p!=null;p=p.next){
			str+=p.data.toString();
			if(p.next!=null)
				str+=",";
		}
		return str+")";
	}
	public static void main(String []args){
		String values[]={"a","b","c","d"};
		SinglyList<String> list=new SinglyList<String>(values);
		System.out.println(list.toString());
		System.out.println(list.find(2));
	}

}

反转单链表

public class SinglyList_reverse 
{
    public static <T> SinglyList<T> createReverse(T[] values)
    {
        SinglyList<T> list = new SinglyList<T>();          //创建空单链表,只有头结点
        for (int i=0; i<values.length; i++)
            list.head.next = new Node<T>(values[i], list.head.next);//头插入
        return list;                                       //返回单链表对象引用
    }
    
    //将单链表逆转,泛型方法,返回值类型前声明类型参数T
    public static <T> void reverse(SinglyList<T> list)
    {
        Node<T> p=list.head.next, front=list.head;              //head必须声明为public 
        while (p!=null)
        {
            Node<T> succ = p.next;                         //succ是p结点的后继结点
            p.next = front;                                //使p.next指向p结点的前驱结点
            front = p;
            p = succ;                                      //p到达后继结点
        }
        list.head.next = front;                  //设置头结点的地址域指向原单链表的最后一个结点
    }
  
    public static void main(String args[])
    {
        String[] values={"A","B","C","D","E","F"};
        SinglyList<String> lista = new SinglyList<String>(values);
        System.out.print("lista = "+lista.toString());
        reverse(lista);
        System.out.println(",逆转后 "+lista.toString());
        
        SinglyList<String> listb = createReverse(values);
        System.out.print("listb = "+listb.toString());
        System.out.println(",lista.equals(listb)? "+lista.equals(listb));        
    }
}

循环单链表


public class CirSinglyList<T> extends Object{
	public Node<T> head;
	
	public CirSinglyList(){
		this.head=new Node<T>();
		head.next=this.head;
	}
	public CirSinglyList(T[] values){
		this();
		Node<T> rear=this.head;
		for(int i=0;i<values.length;i++){
			rear.next=new Node<T>(values[i],null);
			rear=rear.next;
		}
		rear.next=this.head;
	}
	public String toString(){
		String str=this.getClass().getName()+"(";
		for(Node<T> p=this.head.next;p!=this.head;p=p.next){
			str+=p.data.toString();
			if(p.next!=this.head)
				str+=",";
		}
		return str+")";
	}
	boolean removeAll(SinglyList<T> list){
		boolean IS=false;
		Node<T> p = list.head.next;  
		while(p!=null){
			Node<T> front=this.head;
			Node<T> q=front.next;
			while(q!=this.head&&!p.data.equals(q.data)){
					 front = q;                                     
			         q=q.next;
			}
			if(q!=this.head){
				front.next=q.next;
			         IS=true;
			}

		p=p.next;
		
	}
	return IS;	
}
	public static void main(String arg[]){
		String a[]={"1","2","3","4"};
		String b[]={"1","2","3","4","5","6"};
		String c[]={"7","8"};
		SinglyList<String> list1=new SinglyList<String>(a);
		CirSinglyList<String> list2=new CirSinglyList<String>(b);
		CirSinglyList<String> list3=new CirSinglyList<String>(c);
		System.out.println(list1.toString());
		System.out.println(list2.toString());
		boolean d=list2.removeAll(list1);
		boolean e=list3.removeAll(list1);
		if(d)
			System.out.println("list 2 success");
		else
			System.out.println("list 2 fail");
		if(e)
			System.out.println("list 3 success");
		else
			System.out.println("list 3 fail");
		System.out.println(list1.toString());
		System.out.println(list2.toString());
		System.out.println(list3.toString());
	}
}

栈的建立及链表进出栈

public interface Stack<T> {                       
    public abstract boolean isEmpty();           
    public abstract void push(T x);             
    public abstract T peek();                    
    public abstract T pop();                     
}
public final class LinkedStack<T> implements Stack<T>
{
    private SinglyList<T> list;                            
    public LinkedStack()                                   
    {
        this.list = new SinglyList<T>();                   
    }
    public boolean isEmpty()                              
    {
        return this.list.isEmpty();
    }
    public void push(T x){
    	this.list.insert(0, x);
    }
    
    public T peek()                                        
    {
        return this.list.get(0);
    }
    public T pop()                                         
    {
        return this.list.remove(0);                       
    }
    public int length(){
    	return list.size();
    }
    public T top(){
    	return list.find(0);
    }
    public T top_parent(){
    	return list.find(1);
    }
    
    public String toString()                               
    {
        return this.getClass().getName()+" "+this.list.toString();
    }
    
    public static void main(String []args){
    	LinkedStack<String> stack= new LinkedStack();
    	stack.push("A");
    	stack.push("B");
    	stack.push("C");
    	//stack.push("D");
    	System.out.println(stack.toString());
    	System.out.println(""+stack.length());
    }
	
}

猜你喜欢

转载自blog.csdn.net/qq_37808895/article/details/88624170