13:在O(1)时间删除单链表节点
2015-07-06 15:28
169 查看
题目:给定单项链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。
解析:
删除单向链表中的一个节点,常规做法是必须找到待删除节点的前一个节点才能实现,而这样做的时间复杂度是O(n),无法满足要求。
创新想法:当我们想删除一个节点时,并不一定要删除节点本身,可以用当前节点保存它下一节点的值,然后删除它的下一个节点。
情况案例:
1. 输入节点为NULL
2. 单链表只有一个节点,即删除头节点
3. 待删除节点是尾节点,即没有下一节点
4. 待删除不是尾节点
当待删除节点是尾节点时,采用常规方法:须找到待删除节点的前一个节点才能实现O(n),但对于其他的非尾节点可以以O(1)的时间删除,因此平均时间复杂度是[(n-1)*O(1) + O(n)]/n,结果还是O(1)
本题批注:
删除一个节点时,并不一定要删除节点本身,可删除它的下一个
删除一个节点,要free或delete,并且置为NULL
解析:
删除单向链表中的一个节点,常规做法是必须找到待删除节点的前一个节点才能实现,而这样做的时间复杂度是O(n),无法满足要求。
创新想法:当我们想删除一个节点时,并不一定要删除节点本身,可以用当前节点保存它下一节点的值,然后删除它的下一个节点。
情况案例:
1. 输入节点为NULL
2. 单链表只有一个节点,即删除头节点
3. 待删除节点是尾节点,即没有下一节点
4. 待删除不是尾节点
当待删除节点是尾节点时,采用常规方法:须找到待删除节点的前一个节点才能实现O(n),但对于其他的非尾节点可以以O(1)的时间删除,因此平均时间复杂度是[(n-1)*O(1) + O(n)]/n,结果还是O(1)
本题批注:
删除一个节点时,并不一定要删除节点本身,可删除它的下一个
删除一个节点,要free或delete,并且置为NULL
typedef struct ListNode { int val; struct ListNode* next; } ListNode; // 如果要找到待删除节点的前一结点就是O(n), // 要想实现O(1)就不能查找,因此我们用待删除节点保存它下一节点的内容,然后删除下一节点 ListNode* DeleteElement(ListNode* head, ListNode* pToDeleted) { if (head == NULL || pToDeleted == NULL) return head; // 只有一个节点 if (head == pToDeleted) { delete pToDeleted; head = NULL; pToDeleted = NULL; return NULL; } if (pToDeleted->next == NULL) { // 待删除的为最后一个节点 ListNode* pNode = head; while (pNode->next != pToDeleted) // 常规方法找到待删除前一结点 pNode = pNode->next; pNode->next = NULL; delete pToDeleted; pToDeleted = NULL; } else { // 要删除的节点不是尾节点 ListNode* pNext = pToDeleted->next; pToDeleted->val = pNext->val; pToDeleted->next = pNext->next; delete pNext; pNext = NULL; } return head; }
相关文章推荐
- linux系统下apache服务的启动、停止、重启命令
- Android 开源项目android-open-project解析之(二) GridView,ImageView,ProgressBar,TextView
- 理解Python的With语句
- [华为机试真题][2014]64.实现两个合法时间相加
- MySQL详解(15)-----------海量数据讲解
- 【核心研究】消息队列_MessageQueue
- Swift高级语法学习总结
- AndroidStudio 添加svn插件
- C#中遇到dll与.net 4.0不兼容,Mixed mode assembly is built against version 'v2.0.50727' 的解决办法
- Ubuntu系统访问Windows共享文件夹的方法
- PL/SQL Developer连接本地Oracle 11g 64位数据库
- 打印九九乘法表
- ehcache实践
- Mysql bit类型带来的坑
- iOS 网络编程 GCDasynsocket socket 发送数据
- javascript的函数和对象
- Echarts-echart和springMVC实现堆栈图
- Spring mvc 返回json格式
- Unity3d中UI开发的MVC模式
- 数据库死锁实例分析及解决方法