欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

单链表的实现

程序员文章站 2022-05-06 12:37:06
...

节点的封装:

package SingleLinkedList;
/*
 * 但链表表节点的封装
 * 一个Node节点包含的数据是元素和下一个节点的连接
 */
public class Node <E>{
	public E e;
	public Node next;
	public Node(E e, Node next) {
		this.e = e;
		this.next = next;
	}
	public Node(E e) {
		this(e, null);
	}
	public Node() {
		this(null, null);
	}
	@Override
	public String toString() {
	  return e.toString();
	}

}

节点的封装:

package SingleLinkedList;
/*
 * 单链表的实现
 */
public class SingleLinkedList<E> {
  private Node nullhead;  //声明空头节点
  private int size; // 链表存放的元素
  public SingleLinkedList() {
	  nullhead =new Node(null,null);
	  size=0;
  }
//  在链表头位置添加元素
  public void addFirst(E e){
     add(0,e);	
  }
  public void addLast(E e) {
	 add(size,e);
  }
  //在任意位置添加元素
  public void add(int index, E e) {
	// TODO Auto-generated method stub
	if(index<0||index>size) {
		throw new IllegalArgumentException("add failed,index is invaild");
		
	}
	Node prev =nullhead;
	for(int i=0;i<index;i++) {
		prev =prev.next;
	}
//  创建一个待插入的节点node
	Node node =new Node(e);
//  将该节点挂接到链表中(要注意顺序,先连尾部先)
//	node.next=prev.next;
//	prev.next=node;
	prev.next =new Node(e,prev.next); //等同于上面两行代码,比较简洁
//   维护size
	size++; 
}
 // 删除元素首个
  public Object removeFirst() {
	  return remove(0);
  }
  public E removerLast() {
	  return remove(size-1);
  }
  public E remove(int index) {
	// TODO Auto-generated method stub
	if(index<0||index>=size) {
		throw new IllegalArgumentException("remove failed,index is invaild");
	}
	Node prev =nullhead; //
//  通过这个for循环,找到待删除的节点的前一个节点
	for(int i=0;i<index;i++) {
		prev=prev.next;
	}
    Node delnode =prev.next;//待删除的节点
    prev.next =delnode.next; //开始连接
    delnode.next=null; //断开连接
    size--;
	return (E) delnode.e;
}
  
   public void set(int index,E e) {
	   if(index<0||index>=size) {
		   throw new IllegalArgumentException("set failed ,index is invaild");
	   }
//   先拿到头节点,以便遍历
	   Node cur =nullhead.next;
	   int i=0;
	   while(cur!=null) {
		      if(i==index) {
		    	  cur.e=e;
		      }
		      i++;
		     cur= cur.next;
	   }
   }
   public E get(int index) {
	  if(index<0||index>=size) {
		  throw new IllegalArgumentException("get failed ,index is invaild");
	  }
	  Node cur =nullhead.next;
	  int i=0;
	  while(cur!=null) {
		    if(i==index) {
		    	return (E) cur.e;
		    }
		    i++;
		    cur=cur.next;
	  }
	   
	return null;
   }
   public E getfirst() {
	   return  get(0);
   }
   public boolean isEmpty() {
	   return size==0;
   }
   public int getSize() {
	   return size;
   }
//重写打印输出
public String toString() {
    StringBuilder res=new StringBuilder();
    res.append("linkedList:");
    Node cur =nullhead.next;//第一个节点,也就是头节点
    while(cur!=null) {
    	res.append(cur+"->");
    	cur=cur.next;
    }
    res.append("null");
	return res.toString();
}
}

测试:

package SingleLinkedList;

public class SingleLinkedListTest {
public static void main(String[] args) {
	SingleLinkedList lis =new SingleLinkedList<Integer>();
	lis.addFirst(10); //往头部添加元素
	for(int i=1;i<6;i++) {
		lis.add(i, i); //往插入元素
	}
	lis.addLast(10);
	System.out.println(lis); //ok添加没有问题测试没有问题
	lis.remove(1);
	lis.removeFirst();
	lis.removerLast();
	System.out.println(lis); //ok删除测试没有问题;
	lis.set(1, 100);
	System.out.println(lis); //ok改没有问题
	System.out.println( "查第三个下标元素是"+lis.get(3)); //查
	System.out.println("获取元素个数:"+lis.getSize()); //查
}
}

结果:
单链表的实现