在O(1)的时间删除链表结点
来源:互联网 发布:字幕时间轴调整软件 编辑:程序博客网 时间:2024/06/04 18:13
1 /*
2 在O(1)的时间删除链表结点
3 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下
4 struct ListNode
5 {
6 int m_nValue;
7 ListNode* m_pNext;
8 };
9
10 void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);
11 */
12
13 /*
14 在单向链表中删除一个结点,最常规的做法无疑是从链表的头结点开始,顺序遍历查找要删除的结点,并在链表中删除该结点。
15 自然。这样的时间复杂度为O(n),达不到题目的要求。需要遍历去查找到将要删除的结点的前面一个结点。在单向链表中,结点中没
有指向前一个结点的指针,所以只能从头结点开始顺序查找。
16 那是不是一定需要得到被删除的结点的前一个结点呢?答案是否定的。我们可以很方便得到要删除结点的下一个结点。如果我们把下
一个结点的内容复制到需要删除的结点上覆盖原有的内容,再把下一个结点删除,那是不是就相当于把当前需要删除的结点删除了。
17 但是如果要删除的结点位于链表的尾部,那么它就没有下一个结点,怎么办?我们任然从链表的头结点开始,顺序遍历得到该结点的
前序结点,并完成删除操作。
18 最后需要注意的是,如果链表中只有一个结点,而我们又要删除链表的头结点(也是尾结点),此时我们在删除结点之后,还需要把
链表的头结点设置为NULL.
19 对应的代码如下:
20 */
2 在O(1)的时间删除链表结点
3 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下
4 struct ListNode
5 {
6 int m_nValue;
7 ListNode* m_pNext;
8 };
9
10 void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);
11 */
12
13 /*
14 在单向链表中删除一个结点,最常规的做法无疑是从链表的头结点开始,顺序遍历查找要删除的结点,并在链表中删除该结点。
15 自然。这样的时间复杂度为O(n),达不到题目的要求。需要遍历去查找到将要删除的结点的前面一个结点。在单向链表中,结点中没
有指向前一个结点的指针,所以只能从头结点开始顺序查找。
16 那是不是一定需要得到被删除的结点的前一个结点呢?答案是否定的。我们可以很方便得到要删除结点的下一个结点。如果我们把下
一个结点的内容复制到需要删除的结点上覆盖原有的内容,再把下一个结点删除,那是不是就相当于把当前需要删除的结点删除了。
17 但是如果要删除的结点位于链表的尾部,那么它就没有下一个结点,怎么办?我们任然从链表的头结点开始,顺序遍历得到该结点的
前序结点,并完成删除操作。
18 最后需要注意的是,如果链表中只有一个结点,而我们又要删除链表的头结点(也是尾结点),此时我们在删除结点之后,还需要把
链表的头结点设置为NULL.
19 对应的代码如下:
20 */
21
22 void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted) 23 { 24 if(!pListHead || !pToBeDeleted) 25 return; 26 27 //要删除的结点不是尾结点 28 if(pToBeDeleted->m_pNext != NULL) 29 { 30 ListNode* pNext = pToBeDeleted->m_pNext; 31 pToBeDeleted->m_nValue = pNext->m_nValue; 32 pToBeDeleted->m_pNext = pNext->m_pNext; 33 delete pNext; 34 pNext = NULL; 35 } 36 37 //只有一个结点 38 else if(pListHead == pToBeDeleted) 39 { 40 delete pToBeDeleted; 41 pToBeDeleted = NULL; 42 *pListHead = NULL; 43 } 44 45 //链表中有多个结点,删除尾结点。要删除的结点为尾结点。 46 else 47 { 48 ListNode* pNode = *pListHead; 49 while(pNode->m_pNext != pToBeDeleted) 50 pNode = pNode->m_pNext; 51 52 pNode->m_pNext = NULL; 53 delete pToBeDeleted; 54 pToBeDeleted = NULL; 55 } 56 }
阅读全文
0 0
- 在O(1)时间删除链表的结点
- 【36】在O(1)的时间删除链表结点
- 在O(1)的时间删除链表结点
- 在O(1)时间删除链表结点--总结
- 在O(1)时间删除链表结点
- 在O(1)时间删除链表结点
- 033-在O(1)时间删除链表结点
- 在O(1)平均时间删除链表结点 [# 13]
- 在O(1)时间删除链表结点
- 在O(1)平均时间删除链表结点
- 在O(1)时间删除链表结点--总结
- 在O(1)时间删除链表结点
- 在O(1)时间删除链表结点
- 在O(1)时间删除链表结点
- 在O(1)时间删除链表结点
- 在O(1)时间删除指定链表结点
- 在o(1)时间删除链表结点
- 在O(1)时间删除链表结点
- vmware12安装centos7系统详解
- ios手机底部input不兼容fixed(被键盘影响)
- 【数据结构基础】二叉排序(搜索)树
- JS,C#,Java随机生成六位数
- Android系统开机启动到Launcher流程总结
- 在O(1)的时间删除链表结点
- mt7688/mt7628 spi通信
- HK + FFMPEG + X264 + QSV + libRTMP + FMS踩了坑
- 使用json解析String数组
- 关于vue中修改export default中脚本报一大堆错的问题
- 判断一个二叉树是否是平衡二叉树
- 欢迎关注小白程序猿的博客
- mongodb 启动及常用命令
- 斗地主之用蚁群算法整理牌型-如何进行牌力估计