在O(1)时间内删除链表结点(特殊情况)

简介: 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点

题目:给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点。链表结点与函数的定义如下:


struct ListNode

{

   int m_nValue;//数据域

   ListNode* m_pNext;//指针域

};

void DeleteNode(ListNode** pListHead,ListNode* pToBeDeleted);

分析:


此题目若按照从前向后遍历寻找要删除的结点则需要O(n)的时间复杂度。


但是假设知道要删除的结点存在于链表中,则思路可以转变为:


1)要删除的结点的后面的结点值赋值给要删除的结点,再把要删除结点的的下一个结点删除。


2)特殊情况1:要删除的结点在链表的尾部,则需要从头开始遍历,因为尾结点的下一个结点不存在不能采用1)的步骤


3)要删除的结点位于头结点,直接删除,并赋NULL即可。


附图:

add936ff011d8eb4f47b17863884d194_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlZGEz,size_16,color_FFFFFF,t_70.png



参考:【1】https://www.cnblogs.com/qingyuuu/p/4766320.html


参考代码:


void DeleteNode(ListNode** pListHead, ListNode* pToBeDeleted)

{

   if (!pListHead || !pToBeDeleted)

return;

 if (pToBeDeleted->m_pNext != NULL)

 {

  ListNode* pNext = pToBeDeleted->m_pNext;

  pToBeDeleted->m_nValue = pNext->m_nValue;

  pToBeDeleted->m_pNext = pNext->m_pNext;

  delete pNext;

  pNext = NULL;

 }

//链表只有一个结点,删除头结点(也是尾结点)

 else if(*pListHead == pToBeDeleted)

 {

  delete pToBeDeleted;

  pToBeDeleted = NULL;

  *pListHead = NULL;

 }

//要删除的结点是尾结点

else

 {

    ListNode* pNode = *pListHead;

  while (pNode->m_pNext != pToBeDeleted)

  {

    pNode = pNode->m_pNext;

  }

   pNode->m_pNext = NULL;

   delete pToBeDeleted;

   pToBeDeleted = NULL;

  }

}

目录
相关文章
|
24天前
19 删除链表的倒数第 N 个结点
19 删除链表的倒数第 N 个结点
|
24天前
|
算法
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
LeetCode刷题---19. 删除链表的倒数第 N 个结点(双指针-快慢指针)
|
24天前
|
算法 安全 数据处理
LeetCode刷题---707. 设计链表(双向链表-带头尾双结点)
LeetCode刷题---707. 设计链表(双向链表-带头尾双结点)
|
11天前
题目----力扣--链表的中间结点
题目----力扣--链表的中间结点
7 0
|
11天前
查找两个链表的第一个公共结点
查找两个链表的第一个公共结点
18 0
|
12天前
|
索引
【力扣刷题】删除链表的倒数第 N 个结点、两两交换链表中的节点、随机链表的复制
【力扣刷题】删除链表的倒数第 N 个结点、两两交换链表中的节点、随机链表的复制
17 0
|
16天前
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点
|
16天前
|
机器学习/深度学习
【一刷《剑指Offer》】面试题 13:在 O(1) 时间删除链表结点
【一刷《剑指Offer》】面试题 13:在 O(1) 时间删除链表结点
|
18天前
19. 删除链表的倒数第 N 个结点
19. 删除链表的倒数第 N 个结点
20 1
|
24天前
19. 删除链表的倒数第 N 个结点
19. 删除链表的倒数第 N 个结点