### 说明:无环链表。这道题可以用O(1)的时间删除链表的链头和中间节点,但是删除链尾还是要O(n)。所以平均时间为O(1)。 ### 思路:其实并不是真正删除该节点,因为要删除这个节点必须要找到它的前一个节点,而我们没有 m_prev 指针,所以我们删除它的后一个节点,因为这个节点的前一个指针我们已经知道了,就是原本要删除的节点,但在删除后一个节点前,我们要把它的值替换掉原本要删除的节点的值。但是最后那个节点不能这么做,因为它是最后的节点~**注意**:上面的思路我已经假设要删除的节点在链表中了。还有一点是,如果删除的是链表中**惟一的一个节点**,那么链头会被修改,所以我们要传入链头(指针)的指针。 下面是代码实现(出自《剑指 offer》): ``` void deleteNode(SList **pHead, SList *pToBeDeleted) { if (pHead == nullptr || pToBeDeleted == nullptr) { return; } // 要删除的节点不是尾节点 if (pToBeDeleted->m_next != nullptr) { SList *pNext = pToBeDeleted->m_next; pToBeDeleted->m_data = pNext->m_data; pToBeDeleted->m_next = pNext->m_next; delete pNext; pNext = nullptr; } else if (*pHead == pToBeDeleted) { // 删除唯一的一个节点 delete pToBeDeleted; pToBeDeleted = nullptr; *pHead = nullptr; } else { // 链表中有多个节点,删除链尾节点 // 只能先找到前一个节点 SList *pPrev = *pHead; while (pPrev->m_next != pToBeDeleted) { pPrev = pPrev->m_next; } pPrev->m_next = nullptr; delete pToBeDeleted; pToBeDeleted = nullptr; } } ```