zoukankan      html  css  js  c++  java
  • 单链表的实现---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);
                        }
    	   
    
                     
                     
    
        }
    }
    
    


     

  • 相关阅读:
    java表达式中运算符优先级
    数据库建表规则
    linux 安装java环境
    springboot指定端口的三种方式
    服务器监控
    Dubbo 的配置主要分为三大类
    oracle数值函数 abs()、 ceil()、 cos()、 cosh()
    linux基础命令总结
    redis+sentinel集群部署
    centos7制作本地yum源
  • 原文地址:https://www.cnblogs.com/oversea201405/p/3752277.html
Copyright © 2011-2022 走看看