总结
我是最棒的!基础不牢,地动山摇!
数据结构
通过自己手动实现ArrayList和LinkedList的基本方法,来理解其含义
ArrayList(动态数组)查,改快
LinkedList(单向链表)插入,删除快
ArrayList
package cn.itsource.arraylist;
import java.util.Arrays;
/**
* 3. 需求:
* 1. 设计一个类可以保存多个任意类型的数据(基于Object数组)
* 2. 可以任意添加任意类型的数据 void add(Object obj)
* version2 自动扩容
* 3. 可以记录当前数据的个数 int size()
* 4. 可以打印当前数据结构的对象,格式如下:[值1,值2.。。。。]
*
* 5. 查询指定下标的元素 Object searchByIndex(int index)
* 6. 查询指定的元素第一次出现的位置 int searchByElement(Object ele);
*
* 7. 修改指定下标处的元素 void updateByIndex(int index,Object obj)
* 8. 删除指定下标处的元素,返回删除的元素 Object deleteByIndex(int index)
* 9. 删除的首次出现的指定元素 void deleteByElement(Object ele)
* 10.插入指定下标处一个指定元素 void insertByIndex(int index,Object obj)
*
* 11.将对象中所有元素清空 void clear();
* 12.可以创建指定长度的ArrayList对象
* 13.创建一个默认长度是10的ArrayList对象
* 14.创建一个默认长度是10,且有指定元素的ArrayList对象
*
* @author tyx666
*
*/
public class ArrayListDemo {
private Object[] value;
/**数组元素个数*/
private int size;
/**
* 12.可以创建指定长度的ArrayList对象
*/
public ArrayListDemo(int length){
Object[] value = new Object[length];
this.value = value;
}
public ArrayListDemo(){
this.value = new Object[10];
}
public ArrayListDemo(Object obj){
this.value = new Object[10];
add(obj);
}
/**
* 添加元素
* @param obj
*/
public void add(Object obj){
//自动扩容
if(size >= value.length){
value = Arrays.copyOf(value, value.length*2);
}
value[size] = obj;
size++;
}
/**获取当前元素个数*/
public int size(){
return size;
}
/**
* 打印方法
*/
@Override
public String toString() {
Object[] newArr = Arrays.copyOf(value, size);
return Arrays.toString(newArr);
}
/**
* 查询指定下标的元素
* @param index
* @return
*/
public Object searchByIndex(int index){
if(index < 0 || index >= size){
throw new IllegalArgumentException("数组下标不再范围内");
}
return value[index];
}
/**
* 返回一个元素第一次出现的位置
* @param ele
* @return
*/
public int searchByElement(Object ele){
int index = 0;
if(ele == null){
for (int i = 0; i < value.length; i++) {
if(value[i] == ele){
break;
}
index++;
}
}else {
for (int i = 0; i < value.length; i++) {
if(ele.equals(value[i])){
break;
}
index++;
}
}
if(index == value.length){
return -1;
}
return index;
}
/**
* 7. 修改指定下标处的元素 void updateByIndex(int index,Object obj)
*/
public void updateByIndex(int index,Object obj){
if(index < 0 || index >= size){
throw new IllegalArgumentException("下标范围错误");
}
value[index] = obj;
}
/**
* 8. 删除指定下标处的元素,返回删除的元素 Object deleteByIndex(int index)
*/
public Object deleteByIndex(int index){
Object obj = value[index];
Object[] newArr = new Object[size-1];
for (int i = 0; i < index; i++) {
newArr[i] = value[i];
}
for(int i = index ;i<newArr.length;i++){
newArr[i] = value[i+1];
}
size--;
value = newArr;
return obj;
}
/**
* 9. 删除的首次出现的指定元素 void deleteByElement(Object ele)
*/
public void deleteByElement(Object ele){
int index = searchByElement(ele);
deleteByIndex(index);
}
/**
* 10.插入指定下标处一个指定元素 void insertByIndex(int index,Object obj)
* @param index
* @param obj
*/
public void insertByIndex(int index,Object obj){
checkIndex(index);
if(size >= value.length){
value = Arrays.copyOf(value, value.length*2);
}
System.arraycopy(value, index, value, index+1, size-index);
size++;
value[index] = obj;
}
/**
* 将对象中所有元素清空 void clear();
*/
public void clear(){
value = new Object[10];
}
/**
* 验证下标的合法性
* @param index
*/
public void checkIndex(int index){
if (index < 0 || index >= size) {
throw new IllegalArgumentException("下标不在范围之内");
}
}
}
LinkedList
package cn.itsource.singlylinkedlist;
/**
* 单向链表底层手动实现
* @author tyx666
* 1. 可以任意添加任意类型的数据 void add(Object obj)
* 2. 可以记录当前数据的个数 int size()
* 3. 可以打印当前数据结构的对象 toString(),格式如下:[值1,值2.。。。。]
*
* 4. 查询指定下标的元素 Object searchByIndex(int index)
* 5. 查询指定的元素第一次出现的位置 int searchByElement(Object ele);
*
* 6. 修改指定下标处的元素 void updateByIndex(int index,Object obj)
* 7. 删除指定下标处的元素,返回删除的元素 Object deleteByIndex(int index)
* 8. 删除的首次出现的指定元素 void deleteByElement(Object ele)
* 9.插入指定下标处一个指定元素 void insertByIndex(int index,Object obj)
*
* 11.将对象中所有元素清空 void clear();
*
*
*/
public class SinglyLinkedList {
/**链表中的头*/
private Node first;
/**记录元素个数*/
private int size;
/**
* 无参构造
*/
public SinglyLinkedList(){
}
/**
* 有参构造
* @param value
*/
public SinglyLinkedList(Object value) {
Node first = new Node(value);
this.first = first;
size++;
}
/**
* 1. 可以任意添加任意类型的数据 void add(Object obj)
* @param obj
*/
public void add(Object obj){
//根据参数创建Node对象
Node node = new Node(obj);
//判断first是否为null,如果是,直接赋值
if (first == null) {
first = node;
}else{
//定义一个变量保存遍历到的位置
Node temp = first;
//遍历链表,直到next为null,添加进去
while(temp.next != null){
temp = temp.next;
}
temp.next = node;
}
size++;
}
/**
* 获取元素个数
* @return
*/
public int size(){
return size;
}
/**
* 3. 可以打印当前数据结构的对象 toString(),格式如下:[值1,值2.。。。。]
*/
@Override
public String toString() {
//定义一个sb来拼接
StringBuilder sb = new StringBuilder("[");
//判断链表是否为空
if(first == null){
return sb.append("]").toString();
}else {
//定义临时变量保存位置
Node temp = first;
while(temp != null){
sb.append(temp.value);
if(temp.next != null){
sb.append(",");
}
temp = temp.next;
}
sb.append("]");
return sb.toString();
}
}
/**
* 4. 查询指定下标的元素 Object searchByIndex(int index)
* @param index
* @return
*/
public Object searchByIndex(int index){
checkIndex(index);
//计数器
int count = 0;
//临时变量
Node temp = first;
while(temp != null){
if(count == index){
return temp.value;
}
count++;
temp = temp.next;
}
return null;
}
/**
* 5. 查询指定的元素第一次出现的位置 int searchByElement(Object ele);
* @param ele
* @return
*/
public int searchByElement(Object ele){
if(ele == null){
//计数器
int index = 0;
//临时变量
Node temp = first;
while(temp != null){
if(temp.value == ele){
return index;
}
temp = temp.next;
index++;
}
}else{
//计数器
int index = 0;
//临时变量
Node temp = first;
while(temp != null){
if(temp.value.equals(ele)){
return index;
}
temp = temp.next;
index++;
}
}
return -1;
}
/**
* 6. 修改指定下标处的元素 void updateByIndex(int index,Object obj)
* @param index
* @param obj
*/
public void updateByIndex(int index,Object obj){
checkIndex(index);
//定义中间变量
Node temp = first;
//计数器
int count = 0;
while(temp != null){
if(count == index){
temp.value = obj;
}
count++;
temp = temp.next;
}
}
/*7. 删除指定下标处的元素,返回删除的元素 Object deleteByIndex(int index)
* 8. 删除的首次出现的指定元素 void deleteByElement(Object ele)
* 9.插入指定下标处一个指定元素 void insertByIndex(int index,Object obj)*/
/**
* 删除指定下标处的元素,返回删除的元素 Object deleteByIndex(int index)
* @param index
* @return
*/
public Object deleteByIndex(int index){
checkIndex(index);
//定义中间变量
Node temp = null;
//计数器
int count = 0;
if(index == 0){
//将要删除的元素赋值给temp保存
temp = first;
//如果是要删除第一个元素,则直接将第二个元素赋值给first
first = first.next;
//元素个数-1
size--;
return temp.value;
}
while(temp != null){
temp = first;
if(count == index - 1 ){
Node temp2 = temp.next;
temp.next = temp2.next;
size--;
return temp2.value;
}
count++;
temp = temp.next;
}
return null;
}
/**
* 8. 删除的首次出现的指定元素 void deleteByElement(Object ele)
* @param ele
*/
public void deleteByElement(Object ele){
int index = searchByElement(ele);
if(index < 0){
return;
}
deleteByIndex(index);
}
/**
* 9.插入指定下标处一个指定元素 void insertByIndex(int index,Object obj)
*/
public void insertByIndex(int index,Object obj){
checkIndex(index);
//创建对象
Node node = new Node(obj);
//考虑在链表头
if(index == 0){
//将之前第一个元素的地址赋值给node对象
node.next = first;
//将新创建的元素地址赋值给node对象
first = node;
//元素个数-1
size--;
}
//中间变量
Node temp = first;
//计数器
int count = 0;
while(temp != null){
if(count == index - 1){
Node temp2 = temp.next;
temp.next = node;
node.next = temp2;
}
count++;
temp = temp.next;
}
}
/**
* 清除链表
*/
public void clear(){
first = null;
size = 0;
}
/**
* 判断下标的合法性
* @param index
*/
public void checkIndex(int index){
if(index < 0 || index >= size){
throw new IllegalArgumentException("下标不在范围内");
}
}
class Node{
private Object value;
private Node next;
public Node(Object value) {
super();
this.value = value;
}
public Object getValue() {
return value;
}
public void setValue(Object value) {
this.value = value;
}
public Node getNext() {
return next;
}
public void setNext(Node next) {
this.next = next;
};
}
}