本文的示例说明如何实现Java链表中的元素删除。 分享仅供参考。 具体如下。
此部分与上一部分有关。 要从链表中删除元素,请执行以下操作:
一、图标删除逻辑
假设必须从链表中删除索引为2的元素。 在这种情况下,链表结构如下。
要删除索引为2的元素,必须获取索引为2的元素前面的前置节点(在本例中为索引为1的元素),因此必须设计记录前置节点的变量prev。
1 .初始时变量prev指向虚拟头节点dummyHead:
2 .找到先前节点的位置,(在此例子中为先前节点位于索引1处的元素)。
在这种情况下,prev记录的next是要删除的节点,标记为delNode变量。
3 .删除操作
步骤1 :将prev下一步指向delNode下一步,如图所示。
代码:
prev.next=delNode.next;
手动将需要删除的节点从链表中移除,以便步骤java可以重用此删除的空间。 也就是说,delNode的next为空。
代码:
delNode.next=null;
二.代码实现删除逻辑
2.1从链表中删除第index(0-based )个位置的元素,返回删除的元素
首先,初始化当前先前节点以指向虚拟头节点,然后遍历查找要删除的节点的先前节点,最后执行删除逻辑。
从//链表中删除第index(0-based )个位置的元素,并返回删除的元素(实际上很少使用,用于练习)。
公共擦除(索引) {
if (索引0||索引=size ) {
thrownewillegalargumentexception (移动故障,illegal索引);
}
//获取虚拟头节点
节点prev=dummy head;
for(intI=0; I索引; I ) {
获取删除//元素之前的节点
prev=prev.next;
}
节点retnode=prev.next; //已删除的元素
prev.next=retNode.next;
retNode.next=null;
size----;
return retNode.e;
}
2.2从链表中删除第一个元素,返回删除的元素
根据remove(intindex )方法实现此方法。
//从链表中删除第一个元素,并返回删除的元素
公共e remove first (
返回移动(0;
}
2.3从链表中删除最后一个元素,返回删除的元素
根据remove(intindex )方法实现此方法。
//从链表中删除最后一个元素,并返回删除的元素
公共e remove last (
返回移除(大小- 1;
}
三.测试删除逻辑
根据上一节的测试代码,添加了删除逻辑代码。 此时,发布所有测试代码。
包链接列表;
公共类测试主{
publicstaticvoidmain (字符串[ ] args ) {
链接列表linked list=new linked list (;
(system.out.println ((==============在链表的开头============) ) ) ) ) ) )
for(intI=0; i 5; I ) {
链接列表. add first (I;
system.out.println (链接列表;
}
(system.out.println ((===========修改链表=============) ) ) ) )
Linkedlist.set(2,666 );
system.out.println (链接列表;
(system.out.println ((===========从链表中提取666个节点============) ) ) ) )
链接列表. remove (2;
system.out.println (链接列表;
}
}
结果如下。
四.链表的时间复杂度分析
4.1添加操作的时间复杂性
(1)添加到链表末尾(addLast ) ) )需要从头遍历,时间复杂度为o(n );
)2)在链表头部(addFirst ),时间复杂度为o(1);
)3)在链表的任意位置添加(add(intindex,e ) ),平均为o ) n/2 )=o ) n );
4.2删除操作的时间复杂性
)1)删除链表中的最后一个元素(移除最后一个(移除最后一个) ) ),需要遍历找到最后一个元素之前的元素,因此时间复杂度为o ) ) n );
)2)删除链表的第一个元素(移动优先(),时间复杂度为o ) )1) )
)3)删除链表中的任意位置节点(remove(index ) ),平均时的时间复杂度为o ) n/2 )=o ) n );
4.3修改操作
由于链表不支持随机访问,需要从头查找直到找到需要修改的节点,因此时间复杂度为o(n )
4.4搜索操作
由于链表不支持随机访问,所以必须从头开始查找,直到找到所需的节点,因此时间复杂度为o(n )
从上面可以看出,链表的添加操作、删除操作、修改操作、检索操作的时间复杂度都是o(n ),看到这一点,心情会突然冷却下来。 这就算做简单的外套,也不像排列那样。 其实是的。 因为对于数组来说,只要有索引就可以高速访问。 但是,对于链表来说,如果只在链表的开头进行追加操作、删除操作、检索操作,其时间复杂度都是0(1),与排列同样是动态的,其优点是不浪费大量的存储器空间。 由于链表是最基础的动态数据结构,在此基础上有关链表的应用不断增加。
关于这个小节,如果你觉得还可以的话,我推荐一下。 谢谢你。
希望本文的描述对大家的java编程有帮助。