链表用java实现简单单链表linkedlist

链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。

每个结点包括两个部分:

1是存储数据元素的数据域data

2是存储下一个结点地址的指针域p。

相比于线性表的优点:插入和删除结点方便。(插入删除的图都不画了,办公软件不好用)

这里是对单链表的理解,并用java的泛型实现,当然与java集合提供的API  LinkedList<E>还是有些不同的,在此只作为理解。

project


首先构造一个Node结点泛型类,结点里的数据类型是泛型E

public class Node<E> {
   E element;//元素
   Node<E> next; //指针
   public Node(E e){
	   element=e;
   }
}
MyAbstractList.java抽象类实现MyList.java,对接口部分实现,MyLinkedList.java继承 MyAbstractList.java抽象类
MyList.java

public interface MyList<E> {
  //添加一个元素
  public void add(E e);
  //在index处添加一个元素
  public void add(int index,E e);
  //清楚一个list列表
  public void clear();
  //删除一个元素
  public boolean remove(E e);
  //删除并返回index处的元素
  public E remove(int index);
  //index处的元素设置为元素e
  public Object set(int index,E e);
  //判断是否包含元素e
  public boolean contains(E e);
  //返回index处的元素
  public E get(int index);
  //返回列表中第一个与元素e匹配的下标index
  public int indexOf(E e);
  //返回列表中最后一个与元素e匹配的元素下标index
  public int lastIndeOf(E e);
  //判断列表是否为空
  public boolean isEmpty();
  //返回列表的大小
  public int size(); 
}
MyAbstractList.java


public abstract class MyAbstractList<E> implements MyList<E> {//部分实现MyList接口
    protected int size=0;  
	protected MyAbstractList(){
    	
    }
    protected MyAbstractList(E[] objects){
    	for(int i=1;i<objects.length;i++)
    	add(objects[i]);
    }
    @Override
    public void add(E e){
    	add(size,e);
    }
    @Override
    public void add(int index,E e){
    	
    }
    @Override
    public boolean isEmpty(){
    	return size==0;
    }
    @Override
    public int size(){
    	return size;
    }
    @Override
    public boolean remove(E e){
    	if(indexOf(e)>=0){
    		remove(indexOf(e));
    		return true;
    	}
    	else return false;
    }
    @Override
    public E remove(int index){
    	return null;
    }
    @Override
   	public void clear() {
   		// TODO Auto-generated method stub
   		
   	}
   	@Override
   	public Object set(int index, E e) {
   		// TODO Auto-generated method stub
   		return null;
   	}
   	@Override
   	public boolean contains(E e) {
   		// TODO Auto-generated method stub
   		return false;
   	}
   	@Override
   	public E get(int index) {
   		// TODO Auto-generated method stub
   		return null;
   	}
   	@Override
   	public int indexOf(E e) {
   		// TODO Auto-generated method stub
   		return 0;
   	}
   	@Override
   	public int lastIndeOf(E e) {
   		// TODO Auto-generated method stub
   		return 0;
   	}
}


MyLinkedList.java

public class MyLinkedList<E> extends MyAbstractList<E>{
       private Node<E> head,tail;
       public MyLinkedList(){    	   
       }
       public MyLinkedList(E[] objects){
    	   super(objects);
       }
       //返回头元素
       public E getFirst(){
    	   if(size==0){
    		   return null;
    	   }
    	   else{
    		   return head.element;
    	   }  		  
       }
       //返回尾元素
       public E getLast(){
    	   if(size==0){
    		   return null;
    	   }
    	   else{
    		   return tail.element;
    	   } 
       }
       //添加首元素
       public void addFirst(E e){
    	   Node<E> newNode=new Node<E>(e);
    	   newNode.next=head;
    	   head=newNode;
    	   size++;
    	   if(tail==null)
    		   tail=head;
       }
       //添加尾元素
       public void addLast(E e){
    	   Node<E> newNode=new Node<E>(e);
    	   if(tail==null){
    		   head=tail=newNode;
    	   }
    	   else{
    		   tail.next=newNode;
    		   tail=tail.next;
    	   }
    	   size++;
       }
       //在index处添加元素
       public void add(int index,E e){
    	   if(index==0) addFirst(e);
    	   else if(index>=size) addLast(e);
    	   else{
    		   Node<E> current=head;
    		   for(int i=1;i<index;i++)
    			   current=current.next;
    		   Node<E> temp=current.next;
    		   current.next=new Node<E>(e);
    		   (current.next).next=temp;
    		   size++;
    	   }
       }
       //删除并返回首元素
       public E removeFirst(){
    	   if(size==0)return null;
    	   else if(size==1){
    		   Node<E> temp=head;
    		   head=tail=null;
    		   size=0;
    		   return temp.element;
    	   }
    	   else{
    		   Node<E> temp=head;
    		   head=head.next;  		  
      		   size--;
    		   return temp.element;
    	   }
       }
       //删除并返回尾元素
       public E removeLast(){
    	   if(size==0)return null;
    	   else if(size==1){
    		   Node<E> temp=head;
    		   head=tail=null;
    		   size=0;
    		   return temp.element;
    	   }
    	   else{
    		   Node<E> current=head;
    		   for(int i=0;i<size-2;i++){
    			   current=current.next;
    		   }
    		   Node<E> temp=tail;
    		   tail=current;
    		   tail.next=null;
    		   size--;
    		   return temp.element;
    	   }
       }
       //删除并返回index处的元素
       public E remove(int index){
    	   if(index<0||index>=size) return null;
    	   else if(index==0) return removeFirst();
    	   else if(index==size-1) return removeLast();
    	   else{
    		   Node<E> previous=head;
    		   for(int i=1;i<index;i++){
    			   previous=previous.next;
    	   }
    		   Node<E> current=previous.next;
    		   previous.next=current.next;
    		   size--;
    		   return current.element;
       }
       }
       public String toString(){
    	   StringBuilder result=new StringBuilder("[");
    	   Node<E> current=head;
   		for(int i=0;i<size;i++){
   			result.append(current.element);
   			current=current.next;
   			if(current!=null){
   				result.append(",");
   			}
   			else{
   				result.append("]");
   			}  			
   		}
   		return result.toString();
       }
       public void clear(){
    	   head=tail=null;
       }
       //是否包含元素e
       public boolean contains(E e){
    	  Node<E> current=head;
          for(int i=0;i<size;i++){
    	  if(current.element.equals(e)){
    			return true;
    	      }
    	  else{
    		   current=current.next;
    		   }
    	  }    	  
    	 return false;
       }
       //返回index处的元素
       public E get(int index){//index都是从0 算起的,size是从1算起的
    	   if(index<0||index>=size) return null;
    	   else if(index==0) return head.element;
    	   else if(index==size-1) return tail.element;
    	   else{
    		   Node<E> current=head;
    		   for(int i=1;i<index;i++)
    			   current=current.next;
    		   Node<E> temp=current.next;
    		   return temp.element;
    	   }   	   
       }
       public int indexOf(E e){
    	   if(size==0) return -1;
    	   else {
    		   Node<E> current=head;
    		   for(int i=0;i<size;i++){
    			   if(current.element.equals(e))
    				   return i;
    			   else current=current.next;
    		   }  			   
    	   }
    	   return -1;
       }
       public int lastIndexOf(E e){
    	   if(size==0) return -1;
    	   else {
    		   Node<E> current=tail;
    		   for(int i=size-1;i>=0;i--){
    			   if(current.element.equals(e))
    				   return i;
    			   else current=current.next;
    		   }  			   
    	   }
    	   return -1;
       }
       //在index处的元素设置为e
       public E set(int index,E e){
    	   if(index<0||index>=size) return null;
    	   else{
    		   Node<E> current=head;
    		   for(int i=1;i<index;i++)
    			   current=current.next;
    		   Node<E> old=current.next;
    		    E oldE=old.element;
    		    old.element=e;
    		   return oldE;    		
    	   }
       }
}

TestMyLinkedList.java

public class TestMyLinkedList {
	public static void main(String[] args) {
		
		MyList<String> list=new MyLinkedList<>();
	       list.add("America");
	       System.out.println("(1)"+list);
	       
	       list.add(0,"Canada");
	       System.out.println("(2)"+list);
	       
	       list.add("Russia");
	       System.out.println("(3)"+list);
	       
	       list.add("France");
	       System.out.println("(4)"+list);
	       
	       list.add(2,"Gemany");//在索引2的位置插入
	       System.out.println("(5)"+list);
	       
	       list.add(5,"Norway");//在索引5的位置插入
	       System.out.println("(6)"+list);
	       
	       list.remove("Canada");//移出
	       System.out.println("(7)"+list);
	       
	       list.remove("2");//移出索引2的元素
	       System.out.println("(8)"+list);
	       
	       list.remove(list.size()-1);
	       System.out.println("(9)"+list);
	}

}

测试结果:

(1)[America]
(2)[Canada,America]
(3)[Canada,America,Russia]
(4)[Canada,America,Russia,France]
(5)[Canada,America,Gemany,Russia,France]
(6)[Canada,America,Gemany,Russia,France,Norway]
(7)[America,Gemany,Russia,France,Norway]
(8)[America,Gemany,Russia,France,Norway]
(9)[America,Gemany,Russia,France]

















  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值