### 说明:无环链表。这道题可以用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;
}
}
```