鱼C论坛

 找回密码
 立即注册
查看: 4210|回复: 10

[已解决]用与n无关的方法删除队列的特定元素?

[复制链接]
发表于 2017-11-16 10:33:21 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 小X学X森 于 2017-11-16 10:33 编辑

QQ截图20171116102145.png
最佳答案
2017-11-16 10:33:22
给你一个时间复杂度为o(1)的方案,还没调试,大概思路是这样的
  1. typedef int ElementType;

  2. struct ListNode
  3. {
  4.     struct ListNode *m_pNext;
  5.     ElementType m_Data;
  6. };

  7. void DeleteNode(ListNode *pListHead, ListNode *pToBeDeleted)
  8. {
  9.     assert(pListHead != NULL && pToBeDeleted != NULL);

  10.     if (pToBeDeleted->m_pNext != NULL) //说明还有后继结点
  11.     {
  12.         ListNode *pTmp = pToBeDeleted->m_pNext;

  13.         //直接把后一个结点赋值给要删除的结点
  14.         pToBeDeleted->m_Data = pTmp->m_Data;
  15.         pToBeDeleted->m_pNext = pTmp->m_pNext;

  16.         //然后删除下一个结点
  17.         free(pTmp);
  18.     }
  19.     else if (pListHead != pToBeDeleted) //如果没有后继结点,而且不是头结点
  20.     {
  21.         ListNode *pTmp = pListHead;

  22.         while (pTmp != NULL)
  23.         {
  24.             //找到要删除结点的前一个
  25.             if (pTmp->m_pNext = pToBeDeleted)
  26.             {
  27.                 //删除pToBeDeleted结点
  28.                 pTmp->m_pNext = pToBeDeleted->m_pNext;
  29.                 free(pToBeDeleted);
  30.                 break;
  31.             }
  32.         }
  33.     }
  34.     else //说明程序只有头结点,删除的也是头结点
  35.     {
  36.         free(pToBeDeleted);
  37.         pListHead = NULL; //这里这个形参被办法返回,所以这个函数的参数定义的有点问题
  38.     }
  39. }
复制代码

数据结构题目.jpg

最佳答案

查看完整内容

给你一个时间复杂度为o(1)的方案,还没调试,大概思路是这样的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-16 10:33:22 | 显示全部楼层    本楼为最佳答案   
给你一个时间复杂度为o(1)的方案,还没调试,大概思路是这样的
  1. typedef int ElementType;

  2. struct ListNode
  3. {
  4.     struct ListNode *m_pNext;
  5.     ElementType m_Data;
  6. };

  7. void DeleteNode(ListNode *pListHead, ListNode *pToBeDeleted)
  8. {
  9.     assert(pListHead != NULL && pToBeDeleted != NULL);

  10.     if (pToBeDeleted->m_pNext != NULL) //说明还有后继结点
  11.     {
  12.         ListNode *pTmp = pToBeDeleted->m_pNext;

  13.         //直接把后一个结点赋值给要删除的结点
  14.         pToBeDeleted->m_Data = pTmp->m_Data;
  15.         pToBeDeleted->m_pNext = pTmp->m_pNext;

  16.         //然后删除下一个结点
  17.         free(pTmp);
  18.     }
  19.     else if (pListHead != pToBeDeleted) //如果没有后继结点,而且不是头结点
  20.     {
  21.         ListNode *pTmp = pListHead;

  22.         while (pTmp != NULL)
  23.         {
  24.             //找到要删除结点的前一个
  25.             if (pTmp->m_pNext = pToBeDeleted)
  26.             {
  27.                 //删除pToBeDeleted结点
  28.                 pTmp->m_pNext = pToBeDeleted->m_pNext;
  29.                 free(pToBeDeleted);
  30.                 break;
  31.             }
  32.         }
  33.     }
  34.     else //说明程序只有头结点,删除的也是头结点
  35.     {
  36.         free(pToBeDeleted);
  37.         pListHead = NULL; //这里这个形参被办法返回,所以这个函数的参数定义的有点问题
  38.     }
  39. }
复制代码

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-11-16 10:33:22 | 显示全部楼层
本帖最后由 小X学X森 于 2017-11-16 10:35 编辑

新手求帮助最好写下代码,嫌烦的话给点思路也可以
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-16 11:13:52 | 显示全部楼层
用无限循环依次遍历各个节点,对数据和目标进行匹配判断,判断成功就删去该节点,然后跳出循环
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-11-16 12:25:05 | 显示全部楼层
本帖最后由 小X学X森 于 2017-11-16 12:31 编辑
BngThea 发表于 2017-11-16 11:13
用无限循环依次遍历各个节点,对数据和目标进行匹配判断,判断成功就删去该节点,然后跳出循环


队列不能在中间直接删除一个元素的吧?可是如果队列中没有这个点的话要怎么退出循环呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-16 12:36:32 | 显示全部楼层
小X学X森 发表于 2017-11-16 12:25
队列不能在中间直接删除一个元素的吧?可是如果队列中没有这个点的话要怎么退出循环呢

看你给的函数形参形式,应该是操作一个链表吧,所以中间删去一个节点应该很容易办到

而题目中强调了是队列中的一个特定的元素,所以目标元素肯定是存在于队列中的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-16 15:04:59 | 显示全部楼层
遍历链表,如果发现链表某个节点和该待删节点的属性匹配,删除之。
具体图为:

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-17 17:02:57 | 显示全部楼层
如果只是链表,做不到与n无关。
不过 python里有 OrderedDict,有序字典。
它既像字典那样直接操作元素,又像链表那样保持元素的插入次序。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-19 01:19:36 | 显示全部楼层
小X学X森 发表于 2017-11-16 12:25
队列不能在中间直接删除一个元素的吧?可是如果队列中没有这个点的话要怎么退出循环呢

if(前驱->next->data==特定) {
temp=前驱->next
前驱->next =前驱->next->next
free(temp); }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-23 12:39:35 | 显示全部楼层
<(¥_$)> 发表于 2017-11-19 12:46
给你一个时间复杂度为o(1)的方案,还没调试,大概思路是这样的

没看出来,怎么就O(1) 了?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-11-25 00:18:13 | 显示全部楼层
SixPy 发表于 2017-11-23 12:39
没看出来,怎么就O(1) 了?

如果不是尾节点,只要将后一个结点赋值给要删除的结点,然后删除后一个结点,这个时间复杂度为o(1)应该没什么疑问,对于尾节点,那遍历时跑不掉了,那对于尾节点来说,时间复杂度为o(n),那总的时间复杂度为o(1)应该就没啥疑问了吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-26 00:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表