博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer18. 在O(1)时间内删除链表节点 P119
阅读量:3951 次
发布时间:2019-05-24

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

剑指offer18. 在O(1)时间内删除链表节点 P119

题目:

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

/* 既然要在O(1)时间内删除,就不需要遍历,或者说大多数情况下不需要遍历整个链表,那么在O(1) 时间内我们能得到哪些东西呢? 1.首先头指针和头指针下一个节点显然没有什么用,再者就是2. 需要删除的节点p和他的下一个节点next, 那么肯定是围绕着p和next操作。如果要删除应该链表节点,通常要找到它的前驱,这一道题能够构成这种前后关系的就是删除next,它的前驱是p,于是我们把next的东西复制给p,再删除next就ok了。以上是普通情况

当p是头结点时候,要特判,p是尾节点时候,只能够遍历整个链表了
此外,因为o(1)时间的限制,我们不能确保链表中有p,这只能交给函数调用者处理了

void deleteNode(ListNode **pHeadList, ListNode *pToDeleteNode) {
if (!(*pHeadList) || !pToDeleteNode) return; if (*pHeadList == pToDeleteNode) {
// 删头节点 ListNode *temp = *pHeadList; if (temp -> next == NULL) {
// 链表只有一个节点 *pHeadList = NULL; delete temp; } else {
// 链表有其他节点 *pHeadList = (*pHeadList) -> next;// 不要使用delete (*pHeadList),在没有被分配之前里面的内容还是完好的。// 而且delete不负责将指针设置为NULL。 delete temp; temp = NULL; } } else if (pToDeleteNode -> next != NULL) {
// 在中间删除,把next值给当前节点, // 并且删除next ListNode *temp = pToDeleteNode -> next; pToDeleteNode -> key = pToDeleteNode -> next ->key; pToDeleteNode -> next = pToDeleteNode -> next -> next; delete temp; temp = NULL; } else if (pToDeleteNode -> next == NULL) {
// 删除尾节点,必须遍历 ListNode *p = *pHeadList; while (p -> next != pToDeleteNode) p = p -> next; p -> next = NULL; delete pToDeleteNode; pToDeleteNode = NULL; }}

转载地址:http://ihzzi.baihongyu.com/

你可能感兴趣的文章
linux内核基本数据类型总结
查看>>
strstr
查看>>
isspace
查看>>
tolower
查看>>
Linux 2.6 字符设备驱动程序
查看>>
Linux 用户态与内核态的交互——netlink 篇
查看>>
Android 的用户层 uevent处理机制
查看>>
linux内核register_chrdev_region()系列函数
查看>>
嵌入式C语言中的volatile关键字
查看>>
Linux驱动程序开发 - 设备驱动模型初探
查看>>
Android之 BatteryService
查看>>
Android init初始化程序分析
查看>>
浅析dev目录下设备文件mknod节点gid,uid和mode的如何方便设置
查看>>
Android 加速度传感器 (G-Sensor) 收
查看>>
Linux 下如何 做patch 和打patch
查看>>
device_driver结构体
查看>>
模拟是本土仪表技术落后的原因之一
查看>>
锂电池驱动分析
查看>>
Android电源管理
查看>>
Android电源管理机制分析(zz)
查看>>