对LinkedList进行增删改查
LinkedList是双向链表,实现了List的接口的容器类,存储数据使用的是地址,始终铭记一点,对链表的操作就是对地址的操作,虽然有索引,但是一切都是以地址为准,对数据进行添加和删除插入的操作就十分迅速。接下来我们实现以下小功能:
- 添加元素功能
/**首先,我们要创建一个临时指针,用于地址的指向*/
/**内部类,存值的类型*/
class Node{
/**创建祖宗类型变量,保存具体的值*/
Object value;
/**临时指针,用于保存下一个元素的地址*/
Node next;
public Node(Object value) {
super();
this.value = value;
}
}
/**
* 1.添加元素功能
* @param ele
*/
public void add(Object ele){
//添加元素方法,就是将创建好的Node对象赋值给指定node
//判断元素是否是第一次添加,如果是,直接将创建好的Node对象赋值给node字段,如果不是则创建
if(first == null){
first = new Node(ele);
size++;
}else{
//将第一个地址赋给临时指针,用于遍历链表
Node node = first;
//查找下个地址为空元素,以便于将要添加的元素地址放上去
while(node.next != null){
node = node.next;
}
//添加新元素
node.next = new Node(ele);
//因为添加了新元素,所以这里需要增加地址空间
size++;
}
}
- 打印对象
/**
* 打印对象,是显示具体的元素功能
* 覆写toString功能即可,使用StringBuilder拼接字符串
*/
@Override
public String toString() {
//定义打印元素的开头:[
StringBuilder sb = new StringBuilder("[");
//遍历链表,拼接每一个元素,最后一个元素不用逗号隔开
if(first == null){
//如果当前没有元素,则直接拼接],返回
sb.append("]");
String str = sb.toString();
return str;
}else{
//将遍历到的元素地址复制临时指针node,node只会指向当前遍历到的元素
Node node = first;
//拼接第一个元素的值
sb.append(node.value);
while(node.next != null){
//每次指向下一个元素之前,都要拼接一个,并且拼接每一个元素的值
sb.append(",");
//将指针移动到下一个元素
node = node.next;
//拼接当前元素的值
sb.append(node.value);
}
//循环完毕后,表示所有元素已经拼接完毕
sb.append("]");
return sb.toString();
}
}
- 返回当前元素个数
/**直接返回长度即可*/
public int size(){
return size;
}
- 查询指定索引的元素
/**
* 4.查询指定索引处的元素,找到了返回元素,没找到返回一个提示
*/
public Object searchElementByIndex(int index){
//索引合法性校验
checkIndex(index);
//遍历整链表
if(first == null){
return null;
}else{
//将遍历到的元素地址复制临时指针node,node只会指向当前遍历到的元素
Node node = first;
//定义计数器用来保存遍历的元素的索引
int count = 0;
//如果是索引是0,则返回第一个元素的值
if(count == index){
return node.value;
}
while(node.next != null){
//将指针移动到下一个元素
node = node.next;
//每一次遍历都将索引+1,并且再次判断跟index关系
if(++count == index){
return node.value;
}
}
//循环完毕后,表示所有元素遍历完毕
return null;
}
}
/**
* 索引合法性校验
* @param index
*/
public void checkIndex(int index){
if(index<0 || index>size-1 ){
throw new IllegalArgumentException("索引越界,索引范围:[0,"+(size-1)+"],而您的输入是:"+index);
}
}
- 查询指定元素的索引
/**
*查询指定元素的索引,如果找到则返回索引,没找到返回-1 searchIndexByElement(Object ele)
*/
public Object searchIndexByElement(Object ele){
Node node = first;
//判断第一个元素是否为空
if(node.next == null && node.value.equals(ele)){
return 0;
}else{
//将当前地址给临时指针,让临时指针遍历当前能遇到的元素
int count = 0;
//元素遍历
while(node.next != null){
if(node.value == ele){
return count;
}else if(node.equals(ele)){
return count;
}
count++;
node = node.next;
}
}
return -1;
}
- 删除指定索引处的元素
/**
*删除指定索引处元素方法
*/
public Object deleteElementByIndex(int index){
//索引检查
checkIndex(index);
//将当前地址给临时指针
Node node = first;
Node preNode = null;
for(int i=0;i<index;i++){
preNode = node;
node = node.next;
}if(index == 0){
first = node.next;
}else{
preNode.next = node.next;
}
return null;
}
- 修改指定索引处元素
/**
*修改指定索引处的元素
*/
public Object updateElementByIndex(int index,Object ele){
//索引检查
checkIndex(index);
Node node = first;
if(index == 0){
node.value = ele;
}
//判断第一个元素是否为空
if(first == null){
return null;
}else{
//将当前地址给临时指针,让临时指针遍历当前能遇到的元素
int count = 0;
while(node.next != null){
node = node.next;
if(++count == index){
node.value = ele;
}
}
}
return null;
}
- 将元素插入指定索引处
/**
*插入指定索引处,指定的元素
*/
public Object insertElementByIndex(int index,Object ele){
//索引检查
checkIndex(index);
//将当前地址给临时指针
Node node = first;
Node preNode = null;
Node node2 = new Node(ele);
//将当前地址给临时指针,让临时指针遍历当前能遇到的元素
for(int i=0;i<index;i++){
preNode = node;
node = node.next;
}if(index == 0){
node2.next = first;
first = node2;
}else{
preNode.next = node2;
node2.next = node;
}
return 0;
}
对于LinkedList的操作,牢记一点,就是对指针指向地址的更改,在此基础上进行的增删改查插,切勿跟ArrayList操作的索引值混淆。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/75272.html