【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结点后面,然后通过交换数据即可。