数据结构-在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