博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
面试题13:在O(1)时间删除链表结点
阅读量:4326 次
发布时间:2019-06-06

本文共 1306 字,大约阅读时间需要 4 分钟。

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

链表结点与函数的定义如下:

1 struct ListNode2 {3   int val;4   ListNode* next;5 };

分析:如下图所示,假设要删除的结点为p结点,若直接删除p结点,则必须知道p的上一个结点,而查找p的上一个结点的时间复杂度为O(N)。可以交换p和p的下一个结点q的数据,然后直接删除q,这样便保证了时间复杂度为O(1)。需要注意的是p为尾结点的情况。这时只能顺序遍历链表并完成删除操作。

1 ListNode * deleteNode( ListNode* head, ListNode* toBeDeleted) 2 { 3     if (head==NULL || toBeDeleted == NULL) 4         return head; 5     if (toBeDeleted->next!=NULL) 6     {
//删除的结点不是尾结点 7 ListNode* q = toBeDeleted->next; 8 toBeDeleted->val = q->val; 9 toBeDeleted->next = q->next;10 delete q;11 q = NULL;12 }13 else14 {15 if (toBeDeleted == head)16 {
//删除的结点既是头结点也是尾结点17 delete toBeDeleted;18 head = NULL;19 toBeDeleted = NULL;20 }21 else22 {
//删除的结点是尾结点不是头结点23 ListNode* p = head;24 while (p->next!=toBeDeleted)25 p = p->next;26 p->next = NULL;27 delete toBeDeleted;28 toBeDeleted = NULL;29 }30 }31 return head;32 }

 PS:上述代码存在一个问题,因为它基于一个假设:要删除的结点的确在链表中。我们需要O(N)的时间才能判断链表中是否包含某一结点。

受到O(1)时间的限制,我们不得不把确保结点在链表中的责任推给了函数的调用者。在面试的时候,可以和面试官讨论这个假设,以便让面试官觉得我们考虑问题非常全面。

转载于:https://www.cnblogs.com/happygirl-zjj/p/4613670.html

你可能感兴趣的文章
Hibernate视频学习笔记(8)Lazy策略
查看>>
CSS3 结构性伪类选择器(1)
查看>>
IOS 杂笔-14(被人遗忘的owner)
查看>>
自动测试用工具
查看>>
前端基础之BOM和DOM
查看>>
[T-ARA/筷子兄弟][Little Apple]
查看>>
编译Libgdiplus遇到的问题
查看>>
【NOIP 模拟赛】Evensgn 剪树枝 树形dp
查看>>
java学习笔记④MySql数据库--01/02 database table 数据的增删改
查看>>
两台电脑如何实现共享文件
查看>>
组合模式Composite
查看>>
程序员最想得到的十大证件,你最想得到哪个?
查看>>
我的第一篇CBBLOGS博客
查看>>
【MyBean调试笔记】接口的使用和清理
查看>>
07 js自定义函数
查看>>
jQueru中数据交换格式XML和JSON对比
查看>>
form表单序列化后的数据转json对象
查看>>
[PYTHON]一个简单的单元測试框架
查看>>
iOS开发网络篇—XML数据的解析
查看>>
[BZOJ4303]数列
查看>>