删除单链表节点O(1)
来源:互联网 发布:为什么windows无法启动 编辑:程序博客网 时间:2024/05/15 23:43
一,题目
给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:
struct ListNode{int m_nKey;ListNode* m_pNext;};
函数的声明如下:
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);
二,分析
这是一道广为流传的Google面试题,能有效考察我们的编程基本功,还能考察我们的反应速度,更重要的是,还能考察我们对时间复杂度的理解。
在链表中删除一个结点,最常规的做法是从链表的头结点开始,顺序查找要删除的结点,找到之后再删除。由于需要顺序查找,时间复杂度自然就是O(n)了。我们之所以需要从头结点开始查找要删除的结点,是因为我们需要得到要删除的结点的前面一个结点。
“狸猫换太子法”:可以从给定要删除的结点得到它的下一个结点。这个时候我们实际删除的是它的下一个结点,在删除之前,我们需要需要把给定的结点的下一个结点的数据拷贝到给定的结点中,然后删除该节点的下一个节点。此时,时间复杂度为O(1)。
上面的思路还有一个问题:如果删除的结点位于链表的尾部,没有下一个结点,怎么办?我们仍然从链表的头结点开始,顺便遍历得到给定结点的前序结点,并完成删除操作。这个时候时间复杂度是O(n)。
那题目要求我们需要在O(1)时间完成删除操作,我们的算法是不是不符合要求?实际上,假设链表总共有n个结点,我们的算法在n-1总情况下时间复杂度是O(1),只有当给定的结点处于链表末尾的时候,时间复杂度为O(n)。那么平均时间复杂度[(n-1)*O(1)+O(n)]/n,仍然为O(1)。
#include <iostream>using namespace std; struct Node{ int data; Node* next;};Node *creat(){ Node *head=new Node(); head->data=0; head->next=NULL; for(int i=10;i>0;--i) { Node *temp=new Node(); temp->data=i; temp->next=NULL; temp->next=head->next; head->next=temp; } return head;} Node *findLastNode(Node *head,int data){ while(head!=NULL&&head->data!=data) { head=head->next; } return head; } void deleteNode(Node *head,Node *del){ if(del->next!=NULL) { Node *p = del->next ; del->data=del->next->data; del->next=del->next->next; delete p; } else { /*这是我们删除最后节点的办法*/ Node *pre=findLastNode(head,9); delete pre->next; pre->next=NULL; } } void print(Node *head){ while(head!=NULL) { cout<<head->data<<" "; head=head->next; } } int main(){ Node *head=creat(); print(head); /*O(1)策略删除一个给定元素*/ Node *del=findLastNode(head,8); deleteNode(head,del); /*O(n)策略删除结尾元素*/ Node *del2=findLastNode(head,10); deleteNode(head,del2); cout<<endl; print(head); }
- 删除单链表节点O(1)
- 单链表,O(1)下删除指定节点
- 剑指offer--单链表O(1)删除节点
- O(1)时间删除节点
- 13:在O(1)时间删除单链表节点
- 面试题11 :O(1)删除单链表节点
- o(1)时间删除单链表的某个节点
- 剑指offer之O(1)删除单链表节点
- 以O(1)时间删除单链表一个节点
- 链表删除节点(O(1))
- 剑指offer面试题13在O(1)时间复杂度内删除单链表的一个节点
- 用O(1)的时间复杂度删除单链表中的某个节点
- 剑指offer10--O(1)的时间实现单链表节点的删除
- 用O(1)的时间复杂度删除单链表中的某个节点
- 用O(1)的时间复杂度删除单链表中的某个节点
- 在O(1)时间内删除链表节点
- 在O(1)时间删除链表节点
- 第二十八题 在O(1)时间内删除指定节点
- MS SQL Server中的日期格式化大全
- iOS7导航控制器自定义返回按钮
- 求一个unsigned int 数的二进制表示中有多少个1?
- iOS开发-NSString-2
- Jsoncpp编程接口及使用方法简介
- 删除单链表节点O(1)
- 执行计划中常见index访问方式
- 【枚举+小技巧】【TOJ4115】【Find the number】
- px、dp、dip、dpi、sp 等到底有什么联系区别?
- dumpsys命令的用法
- 6.2-5
- strcpy与memcpy以及strncpy
- 使用DATEADD和DATEDIFF来计算SQL Server的DATETIME值
- Pivotal Gemfire gfsh shell的使用(1)