单链表的实现---SingleLinkedList

单链表的实现,定义为SingleLinkedList

class Node<AnyType>{        //结点Node类
	 public AnyType data;
	 public Node<AnyType> next;
	 public Node(AnyType d,Node<AnyType> next ){
		 this.data=d;
		 this.next=next;
	 }
	 public Node(AnyType d){
		 this.data=d;
		 this.next=null;
	 }
	 public Node(){
		 this.data=null;
		 this.next=null;
	 }
	
}
public class SingleLinkedList<AnyType extends Comparable<?super AnyType>> {
	   int theSize;
	   Node<AnyType> firstNode;     //定义第一个结点
	
	   public SingleLinkedList(){    //对链表初始化
		   this.firstNode=null;
		   theSize=0;
	   }
	   
	   public int getSize(){          //获取链表长度
		   int count=0;
           if(firstNode==null) return 0;
		   Node<AnyType> p=firstNode;
           while(p!=null){
        	   count++;
        	   p=p.next;
           }  
		   return count;
	   }
	   
	   public Node<AnyType> getNode(int idx){       //获取idx对应的结点
		   Node<AnyType> p;
		   if(idx<0||idx>getSize()){                //判断idx的合法性
			   return null;
		   }
		   else{
			   p=firstNode;
			   for(int i=0;i<idx;i++){
				   p=p.next;
			   }
			   return p; 
		   }
	   }
	   public AnyType setNode(int idx,AnyType newData){       //替换单链表中idx位置的数据
		   Node<AnyType> p=firstNode;
		   if(idx<0||idx>getSize())
			   return null;
		   else{
			   for(int i=0;i<idx;i++)
				   p=p.next;
			   AnyType oldData=p.data;
			   p.data=newData;
			   return oldData;
		   }
	   }
	   
	   public boolean add(AnyType x){          //插入元素,未给出idx自动加到表尾
		   add(getSize(),x);
		   return true;
	   }
	   public void add(int idx,AnyType x){          //将元素加到idx位置
		   Node<AnyType> newNode=new Node<AnyType>(x);
		   if(firstNode==null||idx==0){          //空表
			   newNode.next=firstNode;
			   firstNode=newNode;
			   theSize++;
		   }
		   else   if(idx>theSize+2){              //idx不合法时处理方法
			   System.out.println("插入失败");
		   }
		   else{
			   Node<AnyType> p=getNode(idx-1);
			   newNode.next=p.next;
			   p.next=newNode;
			   theSize++;
			   
		   }
	   }
	   public Boolean remove(int idx){
		   if(firstNode==null){           //空表
			   return false;
		   }
		    else  if(idx==0||firstNode.next==null){          //只有一个结点或idx=0;
		   	    Node<AnyType> p=this.firstNode;     //定义结点p,将头结点的值赋给p
				firstNode=p.next;             //令头结点为p的下一个结点,即删除头结点
				theSize--;
				return true;
			  }
		   
		   else{
			   Node<AnyType> p=getNode(idx-1);
			   Node<AnyType> q=p.next;
			   p.next=q.next;
			   theSize--; 
			   return true;
		   }
	   }

	   public int contains(AnyType x,SingleLinkedList sll){        //判断x是否在链表中
		   int idx=0;
		   Node<AnyType> p=sll.firstNode;
		   if(sll.firstNode==null)            //空表
			   return -1;
		   while(p.data!=x){                  
			   idx++;
			   p=p.next;
			   if(p==null)
				   return -1;
		   }
		   return idx;
	   }
	 
	   public void moveSmall(){               //将最小元素移到链表最前端
		    Node<AnyType> small=firstNode;
		    Node<AnyType> p=firstNode;
		    int id=0;
		    for(int i=0;i<theSize;i++){
		    	if((Integer)p.data<(Integer)small.data||(Integer)p.data==(Integer)small.data){
		    		small=p;
                   id=i;
		    	}
		    	p=p.next;
		    }
		   remove(id);
		   add(0,small.data);  
	   }
	   public void exchange(int x,int y){    ///交换两个相邻位置的元素
		   if(x>y){                   //使x<y
			   int temp=x;x=y;y=temp;   
		   }
		   if(y>getSize()-1){            //输入数据超出范围
			   System.out.println("数据超出范围,交换失败");
		   }
		   else if(getSize()==2){        //单链表只有两个元素
			   Node<AnyType> p=getNode(1);
			   p.next=firstNode;
			   firstNode.next=null;
			   firstNode=p;
		   }
		  
		   else if(getSize()>2&&y==getSize()-1){   //元素个数大于二,交换表尾的两个数据
			 
			   Node<AnyType> p=getNode(x-1);
			   Node<AnyType> q=p.next;
			   p.next=q.next;
			   p.next.next=q;
			   q.next=null;	   
		   }
		   
		   else if(getSize()>2&&x==0){               //元素个数大于二,交换表头的两个数据
			   Node<AnyType> p=getNode(1);
			   firstNode.next=p.next;
			   p.next=firstNode;
			   firstNode=p;
		   } 
		   else if(getSize()>3){                    //元素个数大于4,交换不挨边的数据   
			   Node<AnyType> p=getNode(x-1);
			   Node<AnyType> q=getNode(x);
			   Node<AnyType> r=getNode(y);
			   p.next=r.next;
			   q.next=p.next;
			   r.next=q;
			   p.next=r;
			   
		   }
	   }
	   
	   public void merge(SingleLinkedList La,SingleLinkedList Lb){    //把Lb的元素接到La尾
		    for(int i=0;i<Lb.getSize();i++){
		    	Node<AnyType> p=Lb.getNode(i);
		    	AnyType m=p.data;
		    	La.add(m); 	
		    }
	   }
	public static void main(String[] args) {
		//验证部分
                 SingleLinkedList<Integer> La=new SingleLinkedList<Integer>();
                 SingleLinkedList<Integer> Lb=new SingleLinkedList<Integer>();
                 La.add(1);
                 La.add(2);
                 La.add(3);
                 La.add(4);
                 La.add(5);
                 La.add(6);
                 Lb.add(11);
                 Lb.add(12);
                 Lb.add(13);
                 System.out.println("长度为:"+La.getSize());
                 for(int i=0;i<La.getSize();i++){
                	 System.out.println(La.getNode(i).data);
                 }
                 System.out.println("........................");
                 
                 La.setNode(3,0);
                 La.remove(0);
                 System.out.println("长度为:"+La.getSize());
                 for(int i=0;i<La.getSize();i++){
                	 System.out.println(La.getNode(i).data);
                 }
                 System.out.println("........................");
                 
                 La.add(2,9);
                 System.out.println("长度为:"+La.getSize());
                 for(int i=0;i<La.getSize();i++){
                	 System.out.println(La.getNode(i).data);
                 }
                 System.out.println("........................");
                 
                 System.out.println("结果:"+La.contains(91,La));
                 System.out.println("........................");
                 
                 La.merge(La,Lb);
                for(int i=0;i<La.getSize();i++){
                	 System.out.println(La.getNode(i).data);
                 }
                System.out.println("........................");
                
                     System.out.println("长度为:"+La.getSize());
                	La.exchange(1,2);
                	for(int i=0;i<La.getSize();i++){
                   	 System.out.println(La.getNode(i).data);
                    }
	   

                 
                 

    }
}


 

posted @ 2013-10-12 22:11  IT专业户  阅读(317)  评论(0编辑  收藏  举报