数组实现列表
先写一个接口,定义了列表的增删查改的方法
public interface MyList {
void delete(int index); //根据索引值删除元素
void delete(Object element); //删除某个元素
void add(Object element); //添加一个元素
void update(int index,Object newElement); //修改某一个索引位置的值
boolean contains(Object target); //是否包含目标元素
Object at(int index); //获取目标索引位置的元素
int indexOf(Object element); //获取目标元素的索引
}
接口方法实现
使用数组实现List
public class SingleLinkList implements MyList{
private NodeList head; //头节点
private NodeList last;
int size;
public void delete(int index) {
if(index<0||index>=size) return; //处理边界
int i=0; //节点的索引
NodeList p=head;
NodeList pre=null;
while(p!=null){
if(i==index){
if(p==head){ //如果删除的是头节点
head=head.next; //头节点后移
}else {
pre.next=p.next;
}
size--;
break;
}
pre=p; //前驱指针后移
p=p.next; //p指针后移
i++;
}
}
public void delete(Object element) {
NodeList p=head; //头本身不能动
NodeList pre=null; //p节点的前一个节点 相当于p的前驱 因为是单链表 要实现删除的话 必须要2个指针挨着移动才可以
while(p!=null){
if(p.object.equals(element)){
if(p==head){ //如果删除的是头部节点
head=head.next; //将头部节点后移
}else {
pre.next=p.next;
}
size--;
break; //删除元素后 没必要再继续移动了
}
pre=p; //前驱指针后移
p=p.next; //p指针后移
}
}
public void add(Object element) {
if(head==null){ //链表为空
head=new NodeList(element);
last=head; //头节点 尾节点都是这个节点
}else {
last.next=new NodeList(element);
last=last.next; //尾指针后移
}
size++; //链表的大小+1
}
public void update(int index, Object newElement) {
if(index<0||index>=size) return; //处理边界
int i=0; //节点的索引
NodeList p=head;
while(p!=null){
if(i==index){
p.object=newElement;
break;
}
p=p.next; //p指针后移
i++;
}
}
public boolean contains(Object target) {
NodeList p=head;
while(p!=null){
if(p.object.equals(target)){
return true;
}
p=p.next; //p指针后移
}
return false;
}
public Object at(int index) {
if(index<0||index>=size) return null; //处理边界
int i=0; //节点的索引
NodeList p=head;
while(p!=null){
if(i==index){
return p.object;
}
p=p.next; //p指针后移
i++;
}
return null;
}
public int indexOf(Object element) {
int i=0; //节点的索引
NodeList p=head;
while(p!=null){
if(p.object.equals(element)){
return i;
}
p=p.next; //p指针后移
i++;
}
return -1;
}
@Override
public String toString() {
NodeList p=head; //不要随便去动原来的饿头节点 因此复制一份
StringBuilder sb=new StringBuilder("[");
while(p!=null){
sb.append(p.object);
p=p.next;
if(p!=null){
sb.append(",");
}
}
sb.append("]");
return sb.toString();
}
}
测试,每一个方法都亲测,完全正确