JAVA数据结构LinkedList(单链表)

package p02.动态链表;
//这里实现的接口List已在ArrayList中体现,就不多赘述
import p01.动态数组.List;
//单链表
public class LinkedList<E> implements List<E>{
	private Node head;	//头指针
	private Node rear;	//尾指针
	private int size;	//元素个数
	public LinkedList(){
		head=new Node();	//创建虚拟头节点
		rear=head;
		size=0;
	}
	
	private class Node{
		E data;
		Node next;
		public Node(){
			this(null,null);
		}
		public Node(E data){
			this(data,null);	
		}
		public Node(E data,Node next){
			this.data=data;
			this.next=next;
		}
	}

	@Override
	public int getSize() {
		
		return size;
	}

	@Override
	public boolean isEmpty() {
		
		return size==0;
	}

	@Override
	public void add(int index, E e) {
		if(index<0||index>size){
			throw new IllegalArgumentException("角标非法");
		}
		Node n=new Node(e);
		/*Node n=new Node();
		n.data=e;
		n.next=null;*/
		
		if(index==0){//头插法
			n.next=head.next;
			head.next=n;
			if(isEmpty()){
				rear=n;
			}
		}else if(index==size){//尾插法
			n.next=rear.next;
			rear.next=n;
			rear=n;
		}else{//中间插
			Node p=head;
			for(int i=0;i<index;i++){
				p=p.next;
			}
			n.next=p.next;
			p.next=n;
		}
		size++;
	}

	@Override
	public void addFrist(E e) {
		add(0, e);
	}

	@Override
	public void addLast(E e) {
		add(size, e);
	}

	@Override
	public E get(int index) {
		if(index<0||index>=size){
			throw new IllegalArgumentException("角标非法");
		}
		if(index==0){//表头
			return head.next.data;
		}else if(index==size-1){//表尾
			return rear.data;
		}else{//中间
			Node p=head;
			for(int i=0;i<=index;i++){
				p=p.next;
			}
			return p.data;
		}
	}

	@Override
	public E getFrist() {
		
		return get(0);
	}

	@Override
	public E getLast() {
		
		return get(size-1);
	}

	@Override
	public E remove(int index) {
		if(index<0||index>=size){
			throw new IllegalArgumentException("角标非法");
		}
		
		E res=null;
		if(index==0){//删头
			Node n=head.next;
			res=n.data;
			head.next=n.next;
			n=null;
			if(size==1){
				rear=head;
			}
		}else if(index==size-1){//删尾
			res=rear.data;
			Node p=head;
			while(p.next!=rear){
				p=p.next;
			}
			p.next=rear.next;
			rear=p;
		}else{//删中间
			Node p=head;
			for(int i=0;i<index;i++){
				p=p.next;
			}
			Node n=p.next;
			res=n.data;
			p.next=n.next;
			n=null;
		}
		size--;
		return res;
	}

	@Override
	public E removeFrist() {
		
		return remove(0);
	}

	@Override
	public E removeLast() {
		
		return remove(size-1);
	}

	@Override
	public void set(int index, E e) {
		if(index<0||index>=size){
			throw new IllegalArgumentException("角标非法");
		}
		Node p=head;
		for(int i=0;i<=index;i++){
			p=p.next;
		}
		p.data=e;
	}

	@Override
	public boolean contains(E e) {
		
		return find(e)!=-1;
	}

	@Override
	public int find(E e) {
		if(isEmpty()){
			return -1;
		}
		int index=-1;
		Node p=head;
		while(p.next!=null){
			index++;
			p=p.next;
			if(p.data.equals(e)){
				return index;
			}
		}
		return -1;
	}

	@Override
	public void removeElement(E e) {
		int index=find(e);
		if(index!=-1){
			remove(index);
		}
	}

	@Override
	public void clear() {
		head.next=null;
		rear=head;
		size=0;
	}
	
	public String toString(){
		StringBuilder sb=new StringBuilder();
		if(isEmpty()){
			return "[]";
		}else{
			sb.append("[");
			Node p=head;
			while(true){
				p=p.next;
				if(p==rear){
					sb.append(p.data+"]");
					break;
				}else{
					sb.append(p.data+",");
				}
			}
		}
		return sb.toString();
	}
}

猜你喜欢

转载自blog.csdn.net/sl1130398099/article/details/88917998