标签:hit 直接 href nod turn space plist font 打开
这是目前为止,唯一一道,我不看书就知道怎么做的题。
正常从头遍历的话,很明显时间复杂度是O(n),但是他把目标结点给出来了,这就好办了。
直接用目标节点下一个的m_nValue覆盖目标结点,然后删除目标结点就好了。
打开书一看,啊哈哈哈,果然是这个思路啊,就是作者考虑的比我周到多了。
首先,如果目标节点不是尾结点,直接用下一个节点覆盖目标节点,然后删除下一个结点。
如果目标节点就是尾结点(也是头结点),删除头结点。
如果目标节点就是尾结点(不是头结点,链表有多个结点),那么只能从头结点开始遍历了。
然后分析一下时间复杂度,一个有n个结点的链表,非尾结点有n-1个,直接删除后边的结点,时间复杂度为(n-1)*O(1)。
尾节点有一个,时间复杂度为1*O(n),平均一下就是O(1),满足题目的要求。
void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted) { //参数校验 if (pListHead == nullptr || pToBeDeleted == nullptr) return; //目标结点不位于尾结点,用下一个节点覆盖目标结点 if (pToBeDeleted->m_pNext != nullptr) { ListNode* pNode = pToBeDeleted->m_pNext; pToBeDeleted->m_nValue = pNode->m_nValue; pToBeDeleted->m_pNext = pNode->m_pNext; delete pNode; pNode = nullptr; } //目标节点与头结点重合,链表只有一个结点 else if (*pListHead == pToBeDeleted) { delete pToBeDeleted; pToBeDeleted = nullptr; *pListHead = nullptr; } //链表有多个节点,且目标结点是尾节点 else { ListNode* pNode = *pListHead; while (pNode->m_pNext != pToBeDeleted) { pNode = pNode->m_pNext; } pNode->m_pNext = nullptr; delete pToBeDeleted; pToBeDeleted = nullptr; } return; }
标签:hit 直接 href nod turn space plist font 打开
原文地址:https://www.cnblogs.com/BoqianLiu/p/9451813.html