如何在只给定单链表中某个结点的指针的情况下删除该结点
【XM笔试】
题目描述:
假设给定链表 1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 中指向第3个元素的指针,要求把结点3删除,删除后:1 -> 2 -> 4 -> 5 -> 6 -> 7
解答:
一般情况下,要删除一个单链表的结点,我们直接做法是找到这个结点的前驱,然后通过prev.next = p.next
来实现对结点p的删除,对于本题,我们拿不到前驱结点。
分两种情况,(1)如果这个结点是链表的尾巴结点,那么无法删除这个结点。
(2)如果这个结点不是尾巴结点,我们从这个结点的next开始,总把后一个结点的data复制到当前结点,然后删除最后一个结点,这样就实现了删除当前结点。
-
创建单链表
-
编写删除函数
-
测试
-
分析
这个算法的缺点是没法删除最后一个元素,最差时间复杂度是在删除第一个元素的时候,为O(n)
,没有额外空间开销,所以空间复杂度是O(1)
。 -
扩展思路:
做完这道题之后我们想,如果只给单链表中的某个结点p(非空结点),如何在p之前插入一个结点呢。
解答:
解答很简单,我们先把新结点插入到p结点后面,然后通过交换数据即可。
最近才从csdn迁徙到博客园,欢迎关注交流!
代码改变世界!
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步