首页 > 编程知识 正文

数据结构单链表的删除算法,删除有序链表中的重复元素

时间:2023-05-03 15:22:41 阅读:37278 作者:888

本文的示例说明如何实现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编程有帮助。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。