版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_32693119/article/details/88082322
给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:
struct ListNode {
int m_data;
ListNode* m_pNext;
};
函数的声明如下:
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);
一般单链表删除某个节点,需要知道删除节点的前一个节点,则需要O(n)的遍历时间,但是我们可以得到删除节点的下一个节点的地址,具体的方式就是将下一个节点的值赋值给要删除的节点,并且将下一个节点的下一个节点赋值给删除节点的下一个节点,就相当于删除了当前节点。但是这个方式除了删除尾节点。因为尾节点的下一个节点是NULL。如下:
代码:node.data=node.next.data;
node.next=node.next.next;
若该节点为末尾结点,即node.next==null时。需从头遍历,此时时间复杂度为O(N)。
综上时间复杂度为:(O(1)*(N-1)+O(N))/N=O(1)。
struct ListNode {
int m_data;
ListNode* m_pNext;
};
void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted)
{
if ((pListHead != NULL) && (pToBeDeleted != NULL))
{
if (pToBeDeleted->m_pNext != NULL)//说明不是尾节点
{
ListNode* tmp = pToBeDeleted->m_pNext;
pToBeDeleted->m_data = tmp->m_data;
pToBeDeleted->m_pNext = tmp->m_pNext;
free(tmp);
tmp = NULL;
}
else
{
ListNode* tmp = pListHead;
for (tmp; tmp->m_pNext != pToBeDeleted; tmp = tmp->m_pNext)
{
}
tmp->m_pNext = NULL;
free(pToBeDeleted);
pToBeDeleted = NULL;
}
}
}