java中链表的底层实现_linkedlist底层是双向链表吗?java linkedlist底层实现原理详解...

对于linkedlist底层实现原理你了解吗?linkedlist底层实现原理是通过链表来实现的吗?下面一起来详细的了解一下吧。

是的,我们要清楚的知道,linkedlist底层就是通过链表来实现的。

下面再来详细的给你介绍一下相关知识。

首先我们要深入了解一下链表,链表的单元是节点,除此之外,链表是由多个节点所构成的,每一个节点都涵盖了3个部分,分别是头部指向上的一个节点,中部指向这个节点,尾部指向下一个节点。

双向链表,这里应该都看得明白吧。

e793611ef9d22a89fa01e623670202b4.png

下面再来谈一下优点和缺点:

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);

}

}

以上内容仅供参考,你还想了解更多的相关内容吗?请继续通过本站的常见问题栏目来了解吧。

推荐阅读:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值