如果我们想从单链表中删除现有结点 cur
,可以分两步完成:
- 找到 cur 的上一个结点
prev
及其下一个结点next;
- 接下来链接
prev
到 cur 的下一个节点next。
在我们的第一步中,我们需要找出 prev
和 next
。使用 cur
的参考字段很容易找出 next
,但是,我们必须从头结点遍历链表,以找出 prev
,它的平均时间是 O(N)
,其中 N 是链表的长度。因此,删除结点的时间复杂度将是 O(N)
。
空间复杂度为 O(1)
,因为我们只需要常量空间来存储指针。
示例
让我们尝试把结点 6从上面的单链表中删除。
1. 从头遍历链表,直到我们找到前一个结点 prev
,即结点 23
2. 将 prev
(结点 23)与 next
(结点 15)链接
结点 6 现在不在我们的单链表中。
删除第一个结点
如果我们想删除第一个结点,策略会有所不同。
正如之前所提到的,我们使用头结点 head
来表示链表。我们的头是下面示例中的黑色结点 23。
如果想要删除第一个结点,我们可以简单地将下一个结点分配给 head
。也就是说,删除之后我们的头将会是结点 6。
链表从头结点开始,因此结点 23 不再在我们的链表中。
删除最后一个结点呢?我们还能使用类似的策略吗?