标签:
题目:给定单项链表的头指针和一个结点指针,定义一个函数在o(1)的时间删除该结点,链表的定义如下:
struct ListNode{
int value;
ListNode* next;
};
函数定义:void DeleteNode(ListNode** PListHead,ListNode* pToBedelete);
如上图所示,想要删除一个单链表的中的某个结点有两种方式:
1、如上图中的( b)所示:要删除i结点,必须从头扫描,扫到h(i的前一个结点),然后让其next值指向j(i的下一个位置),然后就可以删除i了。此方法的复杂度为O(n),因为要删除某个结点必须找到其上一个结点,故需要从头遍历。
2、如上图中的(c)所示:要删除i结点,可以先把i的下一节点的值赋给i结点,然后让i的next值指向下一节点的下一结点,就相当于删除i结点。(注意要保存i->next的这个结点,然后再删除),此算法复杂度为O(1),但是必须要求此要删除结点一定是链表中的结点,且当要删除的结点为最后一个结点时,必须用第一种方法,顺序遍历后找到最后一结点的上一结点,然后删除,但此方法的平均时间复杂度仍然为O(1).
故代码如下:
注意:delete结点后一定要让结点指向nullptr(每次都忘。。。)
1 //在O(1)的时间删除链表指定的结点 2 struct ListNode{ 3 int value; 4 ListNode *next; 5 }; 6 void DeleteNode(ListNode** pListHead, ListNode *pToBeDelete) 7 { 8 if (pListHead == nullptr || *pListHead == nullptr || pToBeDelete == nullptr) 9 return; 10 if (*pListHead == pToBeDelete&&pToBeDelete->next == nullptr)//若是头节点也是最后一个节点 11 { 12 delete pToBeDelete; 13 pToBeDelete = nullptr; 14 *pListHead = nullptr; 15 } 16 else if (*pListHead != pToBeDelete&&pToBeDelete->next == nullptr)//若是最后一个节点 17 { 18 ListNode* p = *pListHead; 19 while (p->next!=pToBeDelete) 20 { 21 p = p->next; 22 } 23 delete pToBeDelete; 24 pToBeDelete = nullptr; 25 p->next = nullptr; 26 } 27 else{//要删除的节点不是尾节点 28 ListNode* pd = pToBeDelete->next; 29 pToBeDelete->value = pd->value; 30 pToBeDelete->next = pd->next; 31 delete pd; 32 pd = nullptr; 33 } 34 }
标签:
原文地址:http://www.cnblogs.com/General-up/p/5429073.html