数据结构-在O(1)时间删除链表节点

题目:给定单向链表的头指针和一个节点的指针,定义一个函数在O(1)时间删除该节点。

分析:本题目是基于一个假设,要删除的节点的确在链表中。因为我们需要O(n)的时间来判断该节点是否在链表中。

/*
剑指offer面试题13
本题注意考虑时间效率;
考虑删除节点会是否是尾节点,头节点。以及是否为空判断
为了保证O(1)的时间效率。所以采用直接用要删除的节点覆盖next。
再删除next节点,而不是顺序遍历
为了代码的完整性,初始化了3个节点。
*/
#include <iostream>

using namespace std;

struct ListNode{
    ListNode* next;
    int data;
};

//用指针的指针为了防止head是NULL。
void DeleteNode(ListNode** head,ListNode* Todel){
    if(!head || !Todel){
        return;
    }

    if(Todel->next != NULL){
        ListNode* p = Todel->next;
        Todel->data = p->data;
        Todel->next = p->next;
        delete p;
        p = NULL;
    }
    else if(*head == Todel){
        delete Todel;
        Todel = NULL;
        *head = NULL;
    }
    //假如是尾节点,需要顺序遍历
    else{
        ListNode* p;
        while(p->next != Todel){
            p = p->next;
        }
        p->next = NULL;
        delete Todel;
        Todel = NULL;
    }
}

int main()
{
    ListNode* head;
    ListNode* Todel;
    ListNode* tail;

    head = new ListNode;
    Todel = new ListNode;
    tail = new ListNode;

    head->data = 1;
    head->next = Todel;
    Todel->data = 2;
    Todel->next = tail;
    tail->data = 3;
    tail->next = NULL;

    DeleteNode(&head,Todel);

    return 0;
}

 

转载于:https://www.cnblogs.com/wn19910213/p/3720684.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值