public class MyLink<T> {
//链表的长度
private long length = 0;
//链表的第一个值的位置
private Node first = null;
//链表的最后一个值的位置
private Node last = null;
//链表的值(内部类的模式) T代表值的类型
private class Node<T>{
//T类型的值data
T data;
//值的下一个位置
Node next;
//初始化的构造函数
public Node(T data){
this.data = data;
}
}
//向链表中添加一个值,默认添加到末尾,添加成功返回true
public boolean addLast(T data){//这里要使用内部类中的类型T,必须在主类上添加响应类型T
if(length ==0||first == null){
//代表链表一个元素都没有,可以直接添加
first = new Node(data);
last = first;
}else{//代表链表中有值
Node newNode = new Node(data);
last.next = newNode;
last = newNode;
}
length++;
return true;
}
//在链表中删除一个值
public boolean delete(T data){
//当链表为空的,或者没有元素的时候,代表删除成功
if(length==0||first==null){
return true;
}
//查找元素
Node n = first;
//相当于n的父节点(上一级,因为删除一个元素后,上一级的下一个节点指向删除元素的下一个节点)
Node parentNode = null;
while(n!=null){
//证明找到
if(n.data==data||n.data.equals(data)){
//如果是第一个元素是要删除的元素
if(n==first){
first = first.next;
}else{
//n的上一个节点parentNode的下一个节点指向删除元素n的下一个节点
parentNode.next = n.next;
}
length--;
return true;
}
//没有找到
//先把父节点存储起来
parentNode = n;
//然后继续下一个节点进行查找
n = n.next;
}
//当循环结束,还没有返回,代表这个链表中没有这个值,删除失败
return false;
}
//查找这个元素是否在链表中存在
public boolean seek(T data){
if(first==null||length==0){
return false;
}
Node n = first;
while(n!=null){
//证明找到
if(n.data==data||n.data.equals(data)){
return true;
}
n = n.next;
}
//当循环结束,代表超找结束,没找到这个元素
return false;
}
//插入一个元素到指定元素的的后一位(可能有很多相同的元素,默认只插入到第一个元素的后面)
//参数有两个,一个是需要插入的元素,一个是插入元素的值的位置
public boolean insertAfter(T existsData,T insertData){
if(existsData==null){
return addLast(insertData);
}
Node n = first;
while(n!=null){
//证明找到
if(n.data==existsData||n.data.equals(existsData)){
Node right = n.next;
Node newNode = new Node(insertData);
n.next = newNode;
newNode.next = right;
length++;
return true;
}
n = n.next;
}
//代表没有这个元素,无法插入
return false;
}
}
模拟实现链表结构的增删改查的操作
猜你喜欢
转载自blog.csdn.net/weixin_43888806/article/details/85927543
今日推荐
周排行