对于linkedlist底层实现原理你了解吗?linkedlist底层实现原理是通过链表来实现的吗?下面一起来详细的了解一下吧。
是的,我们要清楚的知道,linkedlist底层就是通过链表来实现的。
下面再来详细的给你介绍一下相关知识。
首先我们要深入了解一下链表,链表的单元是节点,除此之外,链表是由多个节点所构成的,每一个节点都涵盖了3个部分,分别是头部指向上的一个节点,中部指向这个节点,尾部指向下一个节点。
双向链表,这里应该都看得明白吧。
下面再来谈一下优点和缺点:
1、优点,插入和删除的效率快
2、缺点:添加慢
再来谈一下源码的实现(单链)package test2;
//节点类
public class Node
{
// 数据值
private Object obj;
// 下一个节点的内存地址
private Node nextnode;
public Node getNextnode()
{
return nextnode;
}
public void setNextnode(Node nextnode)
{
this.nextnode = nextnode;
}
public Object getObj()
{
return obj;
}
// 无参构造
public Node()
{
super();
}
// 有参构造
public Node(Object obj)
{
this.obj = obj;
}
@Override
public String toString()
{
return "Node [obj=" + obj + ", next=" + nextnode + "]";
}
}package test2;
//实现类
public class MyLinkedList
{
// 第一个节点
private Node firstNode;
// 节点的个数
private int size;
// 添加节点
public void add(Object obj)
{
// 封装一个节点
Node node = new Node(obj);
// 1.判断是否第一个节点
if (firstNode == null)
{
// 2.为空,直接把封装好的节点传入
firstNode = node;
}
else
{
// 3.不为空,说明里面有节点 就遍历 拿到nextNode为空的节点
Node nextnode2 = firstNode;
while (nextnode2.getNextnode() != null)
{
nextnode2 = nextnode2.getNextnode();
}
// 4.拿到之后传值
nextnode2.setNextnode(node);
}
// 记录节点个数
size++;
// System.out.println("进来了" + size);
}
// 删除节点
// a.删除指定索引处的元素
public void deleteByIndex(int index)
{
// 判空
if (index size - 1)
{
throw new RuntimeException("索引值不正确,请重新输入!");
}
// 获取正在被干掉的节点的前一个节点
Node pronode = null;
// 获取正在执行的节点
Node node = firstNode;
for (int i = 0; i
{
pronode = node;
node = node.getNextnode(); // 获取正在被干掉的节点
}
// 索引为0
if (index == 0)
{
firstNode.setNextnode(node.getNextnode());
}
else
{
// 索引不为0
pronode.setNextnode(node.getNextnode());
}
}
// b.删除指定的元素
public void deleteByObj(Object obj)
{
deleteByIndex(getIndexByObj(obj));
}
// 按照索引查出对应的元素
public Object findObjByIndex(int index)
{
// 判空
if (index size - 1)
{
throw new RuntimeException("索引值不正确,请重新输入!");
}
Node node = firstNode;
for (int i = 0; i
{
node = node.getNextnode();
}
return node.getObj();
}
// 指出指定元素的第一次出现的索引
public int getIndexByObj(Object obj)
{
Node node = firstNode;
int index = 0; // 定义索引
while (node != null)
{
if (node.getObj()
.equals(obj))
{
return index;
}
node = node.getNextnode();
index++;
}
return -1;
}
// 查询节点个数
public int list()
{
return size;
}
@Override
public String toString()
{
// 字符串拼接
StringBuilder sb = new StringBuilder("[");
// 创建一个临时变量
Node node = firstNode;
while (node.getNextnode() != null)
{
sb.append(node.getObj());
sb.append(",");
node = node.getNextnode();
}
sb.append(node.getObj());
sb.append("]");
return sb.toString();
}
}package test2;
//测试类
public class Test
{
public static void main(String[] args)
{
MyLinkedList list = new MyLinkedList();
list.add(1);
list.add("hello");
list.add(2);
list.add(3);
list.add(2);
list.add(2);
list.add(2);
list.deleteByIndex(2);
System.out.println(list.findObjByIndex(1));
System.out.println(list.getIndexByObj(2));
System.out.println("节点个数为:" + list.list());
System.out.println(list.getIndexByObj(3));
System.out.println(list);
list.deleteByObj(3);
System.out.println(list);
}
}
以上内容仅供参考,你还想了解更多的相关内容吗?请继续通过本站的常见问题栏目来了解吧。
推荐阅读: