顺序表(底层是数组)
1.打印
public void display(){
//打印顺序表
String result="[";
for(int i=0;i<size;i++){
result+=datas[i];
if(i<size-1){
result+=",";
}
}
result+="]";
System.out.println(result);
}
2.插入元素
public void add(int pos,int data){
//在pos位置上插入数值为data的元素
//判断pos的值是否合法
if(pos<0||pos>size){
return;
}
//容量不够就扩容
if(size>=datas.length){
int[] newDatas=new int[2*datas.length];
for(int i=0;i<datas.length;i++){
newDatas[i]=datas[i];
}
datas=newDatas;
}
//在尾部插入
if(pos==size){
datas[pos]=data;
size++;
return;
}
//在其他位置插入
for(int i=size-1;i>=pos;i--){
datas[i+1]=datas[i];
}
datas[pos]=data;
size++;
}
3.判度是否包含某个元素
public boolean contains(int toFind){
for(int i=0;i<size;i++){
if(datas[i]==toFind){
return true;
}
}
return false;
}
4.查找指定元素
public int search(int toFind){
for(int i=0;i<size;i++){
if(datas[i]==toFind){
return i;
}
}
return -1;
}
5 根据下标查找(设定)元素
public Integer getPos(int pos){
if(pos<0||pos>size){
return null;
}
return datas[pos];
}
public void setPos(int pos,int data){
datas[pos]=data;
}
6.删除指定元素
public void remove(int toRemove){
//先查找位置
int pos=search(toRemove);
if(pos==-1){
return;
}
//如果在末尾就直接删除
if(pos==size-1){
size--;
return;
}
//如果在中间,先删除在搬运
for(int i=pos;i<size-1;i++){
datas[i]=datas[i+1];
}
size--;
}
7.清空元素
public void clear(){
size=0;
}
链表
1.头插
public void addFirst(int data) {
//1.根据data值构建一个node结点
Node node = new Node(data);
//2.如果是空链表
if (head == null) {
head = node;
return;
}
//3.如果不是空链表
node.next = head;
head = node;
}
2.尾插
public void addLast(int data) {
//1.根据data值构建一个node结点
Node node = new Node(data);
//2.如果是空链表
if (head == null) {
head = node;
return;
}
//3.如果不是空链表,就先要找到最后一个节点
Node tail = head;
while (tail.next != null) {
tail = tail.next;
}
//循环结束之后,就找到对应的节点了
tail.next = node;
}
3.打印
public void display() {
//把链表中每个元素都打印出来
for (Node cur = head; cur != null; cur = cur.next) {
System.out.print(cur.data + " ");
}
System.out.println();
}
4.求长度
public int getSize() {
int size = 0;
for (Node cur = head; cur != null; cur = cur.next) {
size++;
}
return size;
}
5.指定位置插入
public boolean addIndex(int index, int data) {
//任意位置插入,下标从0开始
//1.先判断index是否有效
int size = getSize();
if (index < 0 || index > size) {
return false;
}
//2.如果index=0,相当于头插
if (index == 0) {
addFirst(data);
return true;
}
//3.如果index=size,相当于尾插
if (index == size) {
addLast(data);
return true;
}
Node node=new Node(data);
//4.如果index处于中间位置
//1)先找到index的前一个元素
Node prev = getPos(index-1);
node.next=prev.next;
prev.next=node;
return true;
}
6.得到指定下标的值
public Node getPos(int index){
Node cur=head;
for (int i = 0; i < index; i++) {
cur=cur.next;
}
return cur;
}
7.判断是否包含
public boolean contains(int toFind){
for(Node cur=head;cur!=null;cur=cur.next){
if(cur.data==toFind){
return true;
}
}
return false;
}
8.删除指定元素
public void remove(int toRemove){
//1.先判断要删除的元素是不是头结点
if(head.data==toRemove){
head=head.next;
return;
}
//2.不是头节点,首先要找到删除元素的前一个元素
Node prev=searchPrev(toRemove);
//3.改变引用
// prev.next=prev.next.next;
Node toDelete=prev.next;
prev.next=toDelete.next;
}
9.查找元素
public Node searchPrev(int toFind){
for(Node cur=head;cur!=null&&cur.next.next!=null;cur=cur.next){
if(cur.next.data==toFind){
return cur;
}
}
return null;
}
10.删除指定元素
public void removeAll(int toRemove){
//1.如果要删除的元素不是头结点的话
Node prev=head;
Node cur=head.next;
while(cur!=null){
if(cur.data==toRemove){
prev.next=cur.next;
cur=prev.next;
}else{
prev=cur;
cur=cur.next;
}
}
//2.如果要删除的是头节点
if(head.data==toRemove){
head=head.next;
}
}
11.清空链表
public void clear(){
head=null;
}