如何在只给定单链表中某个结点的指针的情况下删除该结点

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

posted @ 2019-11-01 11:26  段明  阅读(698)  评论(0编辑  收藏  举报