Java 自制线性表


一、创建接口

public interface MyList<E> {
	int Size();//元素个数
	boolean isEmpty();//是否为空
	
	void add(E e);//单个元素增加
	void add(E[] e);//多个元素增加
	void add(MyList<E> list);//线性表添加
	
	E remove(int i);//指定下标移除
	void remove(int si, int ei);//区间内元素移除
	int Remove(E e);//单个元素全部移除
	
	void replace(E oldE, E newE);//按照元素替换
	void setS(int i,E e);//按照下标插入
	void setV(E e, E ne);//按照元素插入
	
	E get(int i);//按下标获取
	int getFirst(E e);//查找元素的首下标
	int getLast(E e);//查找元素的尾下标
	int getFirst(int i,E e);//查找元素在i之后的首下标
	int getLast(int i,E e);//查找元素在i之前的尾下标
	boolean getCon(E e);//判断是否包含元素
	
	void print();//输出线性表
}

二、用数组和链表实现线性表及其功能

1.创建类实现接口

数组实现:

public class MyArrayList<E> implements MyList<E> {

	Object[] values = {};
	int size = 0;
	int length;
	static final int DEF_LENGTH = 10;

	public MyArrayList() {
		values = new Object[DEF_LENGTH];
		length = DEF_LENGTH;
		size = 0;
	}
	......
}

链表实现:

public class MyLinkList<E> implements MyList<E> {
	
	class Node{
		public Object values;
		public Node next;
		public Node(Object values) {
			this.values = values;
			next = null;
		}
		public Node(){	
			values = null;
			next = null;
		}
	}
	
	Node head;
	int size;
	public MyLinkList() {
		size = 0;
	}
	......
}

2.完善方法

Size

	public int Size() {
		return size;
	}

isEmpty

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

add

数组实现:

	public void add(E e) {
		if(size==length){
			int oldlength = length;
			int newlength = oldlength + (oldlength>>1);
			Object[] newValues = new Object[newlength];
			for(int i=0;i<oldlength;i++) {
				newValues[i] = values[i];		
			}
			values = newValues;
			length = newlength;
		}
		values[size++] = e;
	}
	public void add(E[] e) {
		
			int num = 0;  //保存元素个数的变量
			for(int i = 0; i < e.length; i++)
			{
				if(e[i]!=null) num++;
			}

			
		if(size==length||size+num>=length) {
			
			int n = length;
			if(size+num==length) n=size;
			int oldlength = length + num;
			int newlength = oldlength + (oldlength>>1);
			Object[] newValues = new Object[newlength];
			for(int i=0;i<n;i++) {
				newValues[i] = values[i];		
			}
			values = newValues;
			length = newlength;

		}
	
		for(int i=0;i<num;i++) {
			values[size++] = e[i];
		}
		
	}
	public void add(MyList<E> list) {
		int newlength = length + list.Size();
		Object[] newValues = new Object[newlength];
		for(int i=0;i<length;i++) {
			newValues[i] = values[i];		
		}
		values = newValues;
		length = newlength;

		for(int i=0;i<list.Size();i++) {
			values[size++] = list.get(i);
		}
	
	}

链表实现:

	public void add(E e) {
		Node List = new Node(e); 
		if(size==0) {
			head = List;
			size++;
		}else {
			Node temp = head;
			while(true) {
				if(temp.next==null) {
					break;
				}
				temp = temp.next;
			}
			temp.next = List;
			size++;
		}
	}

	public void add(E[] e) {
		int num = 0;  //保存元素个数的变量
		for(int i = 0; i < e.length; i++)
		{
			if(e[i]!=null) num++;
		}
		
		for(int i=0;i<num;i++) {
			Node List = new Node(e[i]); 
			if(size==0) {
				head = List;
				size++;
			}else {
				Node temp = head;
				while(true) {
					if(temp.next==null) {
						break;
					}
					temp = temp.next;
				}
				temp.next = List;
				size++;
			}
		}	
	}

	public void add(MyList<E> list) {
		
		for(int i=1;i<=list.Size();i++) {
			Node List = new Node(list.get(i)); 
			if(size==0) {
				head = List;
				size++;
			}else {
				Node temp = head;
				while(true) {
					if(temp.next==null) {
						break;
					}
					temp = temp.next;
				}
				temp.next = List;
				size++;
			}	
			
		}
		
	}


remove

数组实现:

	public E remove(int i) {
		E e;
		e = (E)values[i];
		for(int j=i-1;j<size-1;j++) {
			values[j] = values[j+1];
		}
		values[size--] = null;
		return e;
	}

	public void remove(int si, int ei) {
		int s = si-1;
		int n = ei - si + 1;
		for(int i=ei;i<size;i++) {
			values[i-n] = values[i];
		}
		for(int i = size-1;i>=size - n + 1;i--) {
			values[i] = null;		
		}
		size = size - n;
		return;
	}

	public int Remove(E e) {
		int num = 0;
		while(getFirst(e)!=-1) {
			int i = getFirst(e);
			for(int j=i-1;j<size-1;j++) {
				values[j] = values[j+1];
			}
			values[size--] = null;
			num++;	
		}
		return num;
	}

链表实现:

	public E remove(int i) {
		Node temp = head;
		for(int j=1;j<i-1;j++) {
			temp = temp.next;
		}
		E e = (E) temp.next.values;
		temp.next = temp.next.next;
		size--;
		return e;
	}

	public void remove(int si, int ei) {
		
		Node temp = head;
		for(int j=1;j<si-1;j++) {
			temp = temp.next;
		}
		for(int i=0;i<=ei-si;i++) {
			temp.next = temp.next.next;
			size--;
		}
	}

	public int Remove(E e) {
		int num = 0;
		while(getFirst(e)!=-1) {
			int i = getFirst(e);
			if(i==1) {
				head = head.next;
			}else {
				Node temp = head;
				for(int j=1;j<i-1;j++) {
					temp = temp.next;
				}
				temp.next = temp.next.next;
					
			}
			size--;
			num++;
		}
		return num;
	}


set

数组实现:

	public void replace(E oldE, E newE) {
		for(int i=0;i<size;i++) {
			if(values[i].equals(oldE)) {
				values[i] = newE;
			}
		}
	}

	public void setS(int i, E e) {
		Object[] Newvalues = new Object[++size];
		for(int j=0;j<i;j++) {
			Newvalues[j] = values[j];
		}
		Newvalues[i] = e;
		for(int j=i+1;j<size;j++) {
			Newvalues[j] = values[j-1];
		}
		values = Newvalues;
	}

	public void setV(E e, E ne) { 
		
		int n = 0;
		while(getFirst(n,e)!=-1) {
			int i = getFirst(n,e);
			Object[] Newvalues = new Object[++size];
			for(int j=0;j<i;j++) {
				Newvalues[j] = values[j];
			}
			Newvalues[i] = ne;
			for(int j=i+1;j<size;j++) {
				Newvalues[j] = values[j-1];
			}
			values = Newvalues;
			n = i;
		}
	}

链表实现:

	public void replace(E oldE, E newE) {
		Node temp = head;
		for(int i=1;i<=size;i++) {
			if(temp.values==oldE) {
				temp.values = newE;
			}
			temp = temp.next;	
		}	
	}


	public void setS(int i, E e) {
		Node temp = head;
		for(int j=1;j<i;j++) {
			temp = temp.next;
		}
		Node list = new Node(e);
		list.next = temp.next;
		temp.next = list;
		size++;
	}

	public void setV(E e, E ne) {
		Node temp = head;
		while(temp.next!=null) {
				if(temp.values.equals(e)) {
					Node node = new Node(ne);
					node.next = temp.next;
					temp.next = node;
					size++;
				}
				temp = temp.next;			
		}
	}
		

get

数组实现:

	public E get(int i) {
		E e = (E)values[i-1];
		return e;
	}
	public int getFirst(E e) {
		for(int i=0;i<size;i++) {
			if(values[i].equals(e)) {
				return i+1;
			}
		}
		return -1;
	}
	public int getLast(E e) {
		for(int i=size-1;i>=0;i--) {
			if(values[i].equals(e)) {
				return i+1;
			}
		}
		return -1;
	}
	public int getFirst(int i, E e) {
		for(int j=i;j<size;j++) {
			if(values[j].equals(e)) {
				return j+1;
			}
		}
		return -1;
	}
	public int getLast(int i, E e) {
		for(int j=i-2;j>=0;j--) {
			if(values[j].equals(e)) {
				return j+1;
			}
		}
		return -1;
	}
	public boolean getCon(E e) {
		for(int i=0;i<size;i++) {
			if(values[i].equals(e)) {
				return true;
			}
		}
		return false;
	}

链表实现:

	public E get(int i) {
		Node temp = head;
		for(int j=1;j<i;j++) {
			temp = temp.next;
		}
		return (E) temp.values;
	}

	public int getFirst(E e) {
		Node temp = head;
		for(int i=1;i<=size;i++) {
			if(temp.values.equals(e)) {
				return i;
			}
			temp = temp.next;
		}
		return -1;
	}

	public int getLast(E e) {
		Node temp = head;
		int n = -1;
		for(int i=0;i<size;i++) {
			if(temp.values.equals(e)) {
				n = i+1;
			}
			temp = temp.next;
		}
		return n;
	}

	public int getFirst(int i, E e) {
		Node temp = head;
		for(int j=1;j<=i;j++) {
			temp = temp.next;
		}
		for(int j=i+1;j<=size;j++) {
			if(temp.values.equals(e)) {
				return j;
			}
			temp = temp.next;
		}
		return -1;
	}

	public int getLast(int i, E e) {
		Node temp = head;
		int n = -1;
		for(int j=1;j<=i-1;j++)  {
			if(temp.values.equals(e)) {
				n = j;
			}
			temp = temp.next;
		}
		return n;
	}

	public boolean getCon(E e) {
		Node temp = head;
		for(int i=1;i<=size;i++) {
			if(temp.values.equals(e)) {
				return true;
			}
			temp = temp.next;
		}
		return false;
	}

print

数组实现:

	public void print() {
		for(int i=0;i<size;i++) {
			System.out.println("("+(i+1)+") "+values[i]);	
		}
	}

链表实现:

	public void print() {
		if(size==0) {
			System.out.println("表为空");
			return;
		}
		Node temp = head;
		for(int i=0;i<size;i++) {
			System.out.println("("+(i+1)+") "+temp.values);	
			temp = temp.next;
		}
		
	}
  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值