给定头结点和指定结点,删除指定结点在时间复杂度为O(1)

版权声明:本文为博主原创文章,未经博主允许不得转载。 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;
		}
	}
}

猜你喜欢

转载自blog.csdn.net/qq_32693119/article/details/88082322