热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如何在常数时间复杂度下高效删除链表节点(特定场景分析)

在特定场景下,如何实现在常数时间复杂度内高效删除单向链表中的指定节点是一个值得探讨的问题。本文详细分析了给定单向链表的头指针和目标节点指针的情况下,如何设计一个高效的算法,在O(1)时间内完成节点的删除操作。通过巧妙地调整节点之间的连接关系,该方法不仅提高了删除操作的时间效率,还确保了链表结构的完整性。此外,文章还讨论了该方法在实际应用中的优缺点及适用场景。

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

struct ListNode
{int m_nValue;//数据域ListNode* m_pNext;//指针域
};void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);

分析:

此题目若按照从前向后遍历寻找要删除的结点则需要O(n)的时间复杂度。

但是假设知道要删除的结点存在于链表中,则思路可以转变为:

1)要删除的结点的后面的结点值赋值给要删除的结点,再把要删除结点的的下一个结点删除。

2)特殊情况1:要删除的结点在链表的尾部,则需要从头开始遍历,因为尾结点的下一个结点不存在不能采用1)的步骤

3)要删除的结点位于头结点,直接删除,并赋NULL即可。

附图:

参考:【1】https://www.cnblogs.com/qingyuuu/p/4766320.html

参考代码:

void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted)
{if (!pListHead || !pToBeDeleted)
return;if (pToBeDeleted->m_pNext != NULL){ListNode* pNext = pToBeDeleted->m_pNext;pToBeDeleted->m_nValue = pNext->m_nValue;pToBeDeleted->m_pNext = pNext->m_pNext;delete pNext;pNext = NULL;}
//链表只有一个结点,删除头结点(也是尾结点)else if(*pListHead == pToBeDeleted){delete pToBeDeleted;pToBeDeleted = NULL;*pListHead = NULL;}
//要删除的结点是尾结点else{ListNode* pNode = *pListHead;while (pNode->m_pNext != pToBeDeleted){pNode = pNode->m_pNext;}pNode->m_pNext = NULL;delete pToBeDeleted;pToBeDeleted = NULL;}
}

  参考:【2】https://blog.csdn.net/wangfengfan1/article/details/46793755

【3】剑指


推荐阅读
author-avatar
sEn_森森森森森
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有