java 实现基础的链表 增删改查 虚拟头结点

  • 上机课时间有剩,实现了个链表,但想做到尽善尽美,以后有更多的做法和能完善的功能会在博客里面分享,大家一起交流学习~~
  • 有测试用例,重写了toString方法方便测试
  • 维护了size变量
  • 细节,考虑了被删除结点是否被java回收机制回收
  • 采用了虚拟头结点,在删除和添加操作的时候是需要找到待删或待增结点的上一个结点的,这时虚拟头结点的作用就体现出来了,因为head是没有上一个节点的,虚拟头结点可以统一增删逻辑
  • 使用范型类
  • 待完善~
/**
 * 
 * @author 叶叶
 *
 * @param 链表 增删改查
 */
public class LinkedList<E> {
	
	public class ListNode{
		E e;
		ListNode next;
		public ListNode(){
			this(null,null);
		}
		
		public ListNode(E e){
			this.e = e;
		}
		
		public ListNode(E e, ListNode next){
			this.e = e;
			this.next = next;
		}
		
		public String toString() {
			return e.toString();
		}
		
	}
	private ListNode dummyHead;
	private int size;
	
	public LinkedList(){
		dummyHead = new ListNode();
		size=0;
	}
	
	public int getSize(){
		return size;
	}
	
	public boolean isEmpty(){
		return size==0;
	}
	
	public void add(int index, E e){
		if(index<0 || index>size)
			throw new IllegalArgumentException("add fail");
		ListNode pre = dummyHead;
		for(int i=0;i<index;i++){
			pre = pre.next;
		}
		ListNode x = new ListNode(e, pre.next);
		pre.next = x;
		size++;
	}
	
	public void addFirst(E e){
		add(0,e);
	}
	
	public void addLast(E e){
		add(size,e);
	}	
	
	public E get(int index){
		if(index<0 || index>=size)
			throw new IllegalArgumentException("get fail");
		ListNode cur = dummyHead.next;
		for(int i=0;i<index;i++){
			cur = cur.next;
		}
		return cur.e;
	}
	
	public E getFirst(){
		return get(0);
	}

	public E getLast(){
		return get(size - 1);
	}
	
	public void remove(int index){
		if(index<0 || index>=size)
			throw new IllegalArgumentException("remove fail");
		ListNode pre = dummyHead;
		for(int i=0;i<index;i++){
			pre = pre.next;
		}
		//ListNode cur = pre.next;
		pre.next = pre.next.next;//其实已经删除了。但被删除但节点没有被清除
		//cur.next = null;
		size--;
	}
	
	public void removeFirst(){
		remove(0);
	}
	
	public void removeLast(){
		remove(size-1);
	}
	
	public void set(int index, E e){
		if(index<0 || index>=size)
			throw new IllegalArgumentException("set fail");
		ListNode cur = dummyHead.next;
		for(int i=0;i<index;i++){
			cur = cur.next;
		}
		cur.e = e;
	}
	
	public void setFirst(E e){
		set(0,e);
	}
	
	public void setLast(E e){
		set(size-1,e);
	}
	
	
	@Override
	public String toString() {
		StringBuilder res = new StringBuilder();
		ListNode cur = dummyHead.next;
		while(cur!=null){
			res.append(cur.toString()+"->");
			cur = cur.next;
		}
		res.append("null");
		return res.toString();
	}

	public static void main(String[] args) {
		LinkedList<Integer> list = new LinkedList<>();
		list.addFirst(10);
		list.addFirst(12);
		list.addFirst(8);
		System.out.println(list.toString()+"   size:"+list.getSize());
		list.remove(1);
		System.out.println(list.toString()+"   size:"+list.getSize());
		list.addLast(100);
		System.out.println(list.toString()+"   size:"+list.getSize());
		list.add(2,101);
		System.out.println(list.toString()+"   size:"+list.getSize());
		list.setLast(150);
		System.out.println(list.toString()+"   size:"+list.getSize());
		System.out.println("isEmpty:"+list.isEmpty()+"   size:"+list.getSize());

	}

}

猜你喜欢

转载自blog.csdn.net/weixin_41793113/article/details/82795170