首页 文章

从单个链接列表中删除节点

提问于
浏览
-4

我有这个问题:给你一个单链表L,其中L中的每个节点存储一个整数键,以及指向L中下一个节点的指针 . 最后一个节点将其下一个节点设置为NULL . 您将获得指向存储密钥k的节点的指针ptr,该密钥不是列表中的最后一个节点 . 显示如何从给定ptr指向包含k的节点的指针的列表中删除密钥k;你的算法应该具有时间复杂度O(1),即它应该与列表的长度无关 . 假设你有指向L的头部和尾部节点的指针 .

我知道,如果我们有一个双向链表,我们可以删除O(1)时间复杂度的节点,但我们怎么能在单链表中做呢?难道我们不必迭代所有列表才能在它之前找到节点吗?

2 回答

  • 0

    考虑A - > B - > C - > D作为你的链表,让我们说我们必须删除B.'ptr'指向B.

    • 在ptr和ptr.next之间交换数据 . 现在列表是A - > C - > B - > D.

    • 使ptr.next指向ptr.next.next,使列表A - > C - > D

    对于边缘情况,这可能会失败 . 如果'ptr'是第一个节点,你只需要指向ptr.next . 但如果它是最后一个节点,则不能将尾部“后退”,因此在这种情况下,您必须遍历列表并跟踪前一个节点 .

  • 4

    我知道,如何为Stack(LIFO)做 - 用 O(1) 插入/删除

    如果你不介意,那些数据将会倒退,那么你可以像第一个一样添加最后一项 .

    示例:list.insert(1)
    list.insert(2)
    list.insert(3)

    在常规方式将在这样的列表中: (1,2,3) 但如果你需要 O(1) 那么它将是这样的: (3,2,1) - 然后最后一项将在位置1,所以删除将是这样的(红宝石代码)

    def删除
    @head = @head.next
    结束

相关问题