一、创建接口
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;
}
数组实现:
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;
}
}