数组实现列表 先写一个接口,定义了列表的增删查改的方法
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();
}
}
【数组实现列表】测试,每一个方法都亲测,完全正确
推荐阅读
- 笔记|C语言数据结构——二叉树的顺序存储和二叉树的遍历
- C语言学习(bit)|16.C语言进阶——深度剖析数据在内存中的存储
- 数据结构和算法|LeetCode 的正确使用方式
- 先序遍历 中序遍历 后序遍历 层序遍历
- 数据结构|C++技巧(用class类实现链表)
- 数据结构|贪吃蛇代码--c语言版 visual c++6.0打开
- 算法|算法-二分查找
- 数据结构学习指导|数据结构初阶(线性表)
- leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
- java|ObjectOrientedProgramming - 面向对象的编程(多态、抽象类、接口)- Java - 细节狂魔