在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;

  }

}

目录
相关文章
|
1月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
69 1
|
26天前
|
存储 算法 搜索推荐
链表的中间结点
【10月更文挑战第24天】链表的中间结点是链表操作中的一个重要概念,通过快慢指针法等方法可以高效地找到它。中间结点在数据分割、平衡检测、算法应用等方面都有着重要的意义。在实际编程中,理解和掌握寻找中间结点的方法对于解决链表相关问题具有重要价值。
14 1
|
2月前
链表的中间结点
链表的中间结点
179 57
|
5月前
|
算法
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
数据结构和算法学习记录——线性表之双向链表(上)-结点类型定义、初始化函数、创建新结点函数、尾插函数、打印函数、尾删函数
49 0
|
1月前
【LeetCode 09】19 删除链表的倒数第 N 个结点
【LeetCode 09】19 删除链表的倒数第 N 个结点
17 0
|
3月前
|
算法
LeetCode第19题删除链表的倒数第 N 个结点
该文章介绍了 LeetCode 第 19 题删除链表的倒数第 N 个结点的解法,通过使用快慢双指针,先将快指针移动 n 步,然后快慢指针一起遍历,直到快指针到达链尾,从而找到倒数第 N 个结点的前一个结点进行删除,同时总结了快慢指针可减少链表遍历次数的特点。
LeetCode第19题删除链表的倒数第 N 个结点
|
4月前
【数据结构OJ题】链表中倒数第k个结点
牛客题目——链表中倒数第k个结点
38 1
【数据结构OJ题】链表中倒数第k个结点
|
3月前
【刷题记录】链表的中间结点
【刷题记录】链表的中间结点
|
4月前
【数据结构OJ题】链表的中间结点
力扣题目——链表的中间结点
27 0
【数据结构OJ题】链表的中间结点
|
5月前
|
算法
19.删除链表的倒数第N个结点
19.删除链表的倒数第N个结点