20170917_删除单链表中的指定节点
来源:互联网 发布:js的杀破狼为什么下架 编辑:程序博客网 时间:2024/05/22 14:33
20170917_删除单链表中的指定节点
题目1:删除带头结点的单链表L中的结点p,p不是最后一个结点,要求时间复杂度为O(1)。
解题思路:
如果不要求时间复杂度为O(1),我们可以找出p的前驱结点,然后很容易就删除p。
现在要求时间复杂度为O(1),因为p不是最后一个结点,知道结点p我们可以删除p的后继结点,
那么我们可以把p的后继结点元素的值赋给p结点元素的值。
struct ListNode{int value;ListNode *pNext;ListNode(int x):value(x), pNext(nullptr) {}};//p不是最后一个结点void DeleteNode(ListNode * &p){if(p==nullptr || p->pNext==nullptr)return;//p为空,或是单链表中最后一个节点,不符合题意。ListNode *temp_next=p->pNext;p->value=temp_next->value;p->pNext=temp_next->pNext;delete(temp_next);//删除节点temp_nexttemp_next=nullptr;//将节点置为空,防止它成为野指针}
题目2:如果删除的结点p可能是最后一个结点,怎么办?
解题思路:此时只能保证删除结点的平均时间复杂度为O(1),当p不是最后一个结点,
时间复杂度为O(1),当p是最后一个结点时,时间复杂度为O(n)。
struct ListNode{int value;ListNode *pNext;ListNode(int x):value(x), pNext(nullptr) {}};void DeleteNode(ListNode * &p){if(p==nullptr || p->pNext==nullptr)return;//p为空,或是单链表中最后一个节点,不符合题意。if(p->pNext != nullptr)//如果p不是最后一个节点{ListNode *temp_next=p->pNext;p->value=temp_next->value;p->pNext=temp_next->pNext;delete(temp_next);//删除节点temp_nexttemp_next=nullptr;//将节点置为空,防止它成为野指针}else//如果p是最后一个节点{ListNode *pHead;//单链表的头结点指针pHeadListNode *pre=pHead;while(pre->pNext!=p)pre=pre->pNext;pre->pNext=p->pNext;delete(p);p=nullptr;}}
阅读全文
0 0
- 20170917_删除单链表中的指定节点
- 删除单链表指定节点
- 单链表,O(1)下删除指定节点
- 单链表的删除指定节点解析
- 删除指定节点
- 237. Delete Node in a Linked List (删除单链表中的指定节点)
- 0(1)时间删除带头节点单链表指定节点。
- 删除单链表中的某个节点
- 删除单链表中的最大节点。
- 删除单链表中的某个节点
- 057_删除聊表中的重复的节点
- TinyXml 查询指定节点、删除指定节点和增加节点
- TinyXml 查询指定节点、删除指定节点和增加节点
- 删除指定链表节点
- 删除指定的XML节点
- linus建议的删除单链表指定节点的方法
- python实现给定一个单链表删除指定节点
- java删除单链表中的重复节点
- 算法提高 ADV-182 前10名
- 顺序表应用1:多余元素删除之移位算法
- 读《编译原理》第三章
- 子控件抢占父控件事件响应
- 算法提高 ADV-184 素数求和
- 20170917_删除单链表中的指定节点
- 安卓遇到的一些问题
- java中final与volatile-线程安全问题
- 编译原理作业1、2
- Spyder编辑器
- 用cmd查看已连接过的所有wifi名和密码
- 算法提高 ADV-185 五次方数
- 欢迎使用CSDN-markdown编辑器
- IDEA破解 2017 IDEA license server 激活(可用)