自主实现单链表

public class singleLinkleList implements List{
	private Node head = new Node();//头结点,不存储数据,为了编程方便
	private int size;//一共有几个结点
	
	

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

	@Override
	public Object get(int i) {
		Node p = head;
		for(int j=0;j<=i;j++){
			p = p.next;
			
		}
		return p.data;
	}

	@Override
	public boolean isEmpty() {
		return size!=0?true:false;
	}

	@Override
	public boolean contains(Object e) {
		Node p = head;
		for(int i=0;i<size;i++){
			p = p.next;
			if(e.equals(p.data)){
				return true;
			}
		}
		return false;
	}

	@Override
	public int indexOf(Object e) {
		Node p = head;
		for(int i=0;i<size;i++){
			p = p.next;
			if(e.equals(p.data)){
				return i;
			}
		}
		return 0;
	}

	@Override
	public void add(Object e) {
		this.add(size,e);
		
	}

	@Override
	public void add(int i, Object e) {
		//如果i的位置错误报异常
		if(i<0||i>size){
			throw new MyArrayIndexIutOfBoundsException("链表指针越界异常:"+i);
		}
		//从头开始找,从head结点开始找
		Node p = head;
		for(int j=0;j<i;j++){
			p = p.next;
			
		}
		//新建一个结点
		Node newNode = new Node();
		newNode.data=e;
		//指明所结点的值直接后继结点
		
		//指明所结点的直接前驱结点
		p.next = newNode;
		
		//size++
		size++;
	}

	@Override
	public void clear() {
		/*
		Node p = head;
		Node c = null;
		for(int j=0;j<size;j++){
			p.data=null;
			c = p;
			p=p.next;
			c.next = null;
		}
		size=0;
		*/
		for(Node p=head;p!=null;){
			Node c =  p.next;
			p.data=null;
			p.next=null;
			p=c;
		}
			head = null;
			size=0;
	}

	@Override
	public Object remove(int i) {
		if(i<0||i>size){
			throw new MyArrayIndexIutOfBoundsException("链表指针越界异常:"+i);
		}
		Node p = head;
		for(int j=0;j<=i-1;j++){
			p = p.next;
		}
		Node c = p;
		Node remove  =p.next;
		c.next = remove.next;
		Object obj = remove.data;
		remove.data=null;
		remove.next=null;
		size--;
		return obj;
	}

	@Override
	public Object set(int i, Object e) {
		Node p = head;
		for(int j=0;j<=i;j++){
			p = p.next;
		}
		Object c = p.data;
		p.data = e;
		return c;
	}

	@Override
	public Object[] toarray() {
			Object[] obj = new Object[size];
			Node p = head;
			for(int i=0;i<size;i++){
				p = p.next;
				obj[i] = p.data;
			}
			
			return obj;
	}
	@Override
	public String toString() {
		if(size==0){
			return "[]";
		}
		StringBuilder builder = new StringBuilder("[");
		Node p = head.next;
		for(int i=0;i<size;i++){
			if(i!=size-1){
			builder.append(p.data+",");
			}else{
				builder.append(p.data).append("]");
			}
			//移动指针到下一个结点
			p = p.next;
			}
		
		return builder.toString();
	}
}

本文只实现了单链表的部分功能!

猜你喜欢

转载自blog.csdn.net/jx1234562/article/details/82717551