题目:给定单向链表的头指针和一个节点的指针,定义一个函数在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; }