题目描述
在给定单链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下:
struct ListNode
{
int m_nValue;
ListNode* m_pNext;
};
void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted);
解析
在单链表中删除一个结点,最常规的做法是,从链表的头结点开始,顺序遍历查找要删除的结点,并在链表中删除该结点。(从头开始查找,是因为需要得到将被删除结点的前面一个结点,然后修改该接地的next指针)
题目要求在O(n)时间删除,遍历的话时间复杂度就成为O(1)了,不符合条件。
新思路:
要删除结点i,先把i的下一个结点j的内容复制到i,然后把i的指针修改指向结点j的下一个结点,此时再删除结点j,其效果刚好是把结点i给删除了。
注意:如果删除的结点位于链表的尾部,则需要从链表头结点开始遍历得到该结点的前序结点,并完成操作。如果链表只有一个结点,则删除该结点后,需要把链表的头结点设置为NULL。
实现