最近写链表不太顺,无限的段错误。今天中午写的链表删除倒数第k项,用的带尾节点的双向链表,感觉已经把效率提到最高了,还是超时,改了很多方法都不行,最

终决定看博客,发现原来是审题错了,样例给的是以-1结束,我就天真的以为到-1结束,原来题目写的到负数结束,服了。。

先把我觉得最高效的代码贴上:思路是用带尾节点的双向链表存数据,在找倒数第k项时,如果超过表长,直接NULL,如果小于表长除以2,从尾指针往前找,如果大

于,从头指针往后找:

  1. //解法一:带尾节点的双向链表
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<malloc.h>
  5. //using namespace std;
  6. //输入数据,从尾节点,用prior指针向左移K-1位
  7. //注意:遇到头结点,即为不存在,输出NULL
  8.  
  9. #define OK 1
  10. #define ERROR 0
  11. //#define
  12. typedef int ElemType;
  13. typedef int Status;
  14.  
  15. typedef struct DuLNode
  16. {
  17. ElemType data;
  18. DuLNode *prior;//前驱
  19. DuLNode *next;//后继
  20. }DuLNode,*DuLink;
  21.  
  22. typedef struct
  23. {
  24. DuLink head;//头指针
  25. DuLink tail;//尾指针
  26. int length;
  27. }DuLinkList;//它是结构体类型
  28.  
  29. Status Create_DuL_ht(DuLinkList &L)//摸索
  30. {
  31. L.head=(DuLNode*)malloc(sizeof(DuLNode));
  32. L.head->next=NULL;
  33. L.head->prior=NULL;
  34. L.tail=L.head;//应该是这么初始化吧
  35. L.length=;
  36.  
  37. DuLNode *cur=(DuLNode*)malloc(sizeof(DuLNode));//开新节点
  38. cur->next=L.head;//指向头结点
  39. scanf("%d",&cur->data);
  40. while(cur->data>=)
  41. {
  42. cur->next=L.head;
  43. L.tail->next=cur;
  44. cur->prior=L.tail;
  45. L.tail=cur;
  46. L.head->prior=L.tail;
  47. ++L.length;
  48.  
  49. cur=(DuLNode*)malloc(sizeof(DuLNode));
  50. cur->next=L.head;
  51. scanf("%d",&cur->data);
  52.  
  53. }
  54.  
  55. return OK;
  56.  
  57. }
  58.  
  59. Status CountBack_k(DuLinkList &L,int k)
  60. {//用计数器从tail往前找,只要没遇到倒数第k项且没遇到头结点,就前移;
  61. if(k>L.length)
  62. {
  63. printf("NULL");
  64. return OK;
  65. }
  66. DuLNode *p;
  67. if(k<L.length/)
  68. {
  69. int i=;
  70. p=L.tail;
  71. while(p!=L.head&&i<k)
  72. {
  73. p=p->prior;
  74. ++i;
  75. }
  76.  
  77. }
  78. else
  79. {
  80. int i=;
  81. p=L.head->next;
  82. k=L.length-k+;
  83. while(p!=L.head&&i<k)
  84. {
  85. p=p->next;
  86. ++i;
  87. }
  88. }
  89.  
  90. printf("%d",p->data);
  91.  
  92. return OK;
  93.  
  94. }
  95.  
  96. int main()
  97. {
  98. DuLinkList L;
  99. int k;
  100. scanf("%d",&k);
  101. Create_DuL_ht(L);
  102. //printf("%d",L.tail->prior->data);//创建函数没有错误
  103. CountBack_k(L,k);
  104.  
  105. return ;
  106. }//

方法二是用伴随指针,让它与遍历指针相距k个结点,当遍历指针NULL,它就到了倒数第k项(这个方法是老师教的)

  1. /*
  2. //解法二,普通单链表
  3. #include<stdio.h>
  4. #include<stdlib.h>
  5. #include<malloc.h>
  6. #define OK 1
  7. #define ERROR 0
  8. //#define
  9. typedef int ElemType;
  10. typedef int Status;
  11.  
  12. typedef struct LNode
  13. {
  14. ElemType data;
  15. LNode *next;
  16. }LNode,*LinkList;
  17.  
  18. Status Creat_L(LinkList &L)
  19. {
  20. L=(LNode*)malloc(sizeof(LNode));
  21. L->next=NULL;
  22.  
  23. LNode *rear,*cur;
  24. rear=L;
  25. cur=(LNode*)malloc(sizeof(LNode));
  26. scanf("%d",&cur->data);//cin>>cur->data;
  27. cur->next=NULL;
  28.  
  29. while(cur->data!=-1)
  30. {
  31. rear->next=cur;
  32. rear=cur;
  33.  
  34. cur=(LNode*)malloc(sizeof(LNode));
  35. scanf("%d",&cur->data);
  36. cur->next=NULL;
  37.  
  38. }
  39.  
  40. return OK;
  41. }
  42.  
  43. Status CountBack_k(LinkList &L,int k)
  44. {
  45. LNode *p,*q;
  46. p=L->next;
  47. q=NULL;
  48. int i=0;
  49. while(p)
  50. {
  51. p=p->next;
  52. i++;
  53. if(i==k)
  54. q=L->next;
  55. if(i>k)
  56. q=q->next;
  57.  
  58. }
  59.  
  60. if(q)
  61. printf("%d",q->data);//cout<<q->data;
  62. else
  63. printf("NULL");//cout<<"NULL";
  64.  
  65. }
  66.  
  67. int main()
  68. {
  69. LinkList L;
  70. int k;
  71. scanf("%d",&k);//cin>>k;
  72. Creat_L(L);
  73. //cout<<L->next->next->data;输入函数没问题
  74. CountBack_k(L,k);
  75. }//
  76. */

审题还是很重要的,不要看了样例就写啊。。。。。

链表实现比较高效的删除倒数第k项的更多相关文章

  1. 在单链表和双链表中删除倒数第k个结点

    题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...

  2. [算法]在单链表和双链表中删除倒数第k个结点

    题目: 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 要求: 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 解答: 让链表从头 ...

  3. 在单链表和双链表中删除倒数第K个节点

    [说明]: 本文是左程云老师所著的<程序员面试代码指南>第二章中“在单链表和双链表中删除倒数第K个节点”这一题目的C++复现. 本文只包含问题描述.C++代码的实现以及简单的思路,不包含解 ...

  4. 《程序员代码面试指南》第二章 链表问题 在单链表和双链表中删除倒数第K个节点

    题目 在单链表和双链表中删除倒数第K个节点 java代码 /** * @Description:在单链表和双链表中删除倒数第K个节点 * @Author: lizhouwei * @CreateDat ...

  5. 链表中删除倒数第K个节点

    问题描述 分别实现两个函数,一个可以删除单链表中倒数第K个节点,另一个可以删除双链表中倒数第K个节点. 问题分析与解决 从问题当中,我们只能得到一个链表和要删除的第K个节点的信息,于是就有以下思路:如 ...

  6. 链表问题----删除倒数第K个节点

    在单链表和双链表中删除倒数第K个节点 分别实现两个函数,一个可以删除单链表中的倒数第K个节点,一个可以删除双链表中的倒数第k 个节点,要求时间复杂度是 O(N),空间复杂度是 O(1). [解析] 基 ...

  7. 7-19 求链式线性表的倒数第K项(20 分)(单链表定义与尾插法)

    给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理). 输出格式 ...

  8. 7-19 求链式线性表的倒数第K项

    7-19 求链式线性表的倒数第K项(20 分) 给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示 ...

  9. 算法总结之 在单链表和双链表中删除倒数第k个节点

    分别实现两个函数,一个可以删除单链表中倒数第k个节点,另一个可以删除双链表中倒数第k个节点 思路: 如果链表为空,或者k<1 参数无效 除此之外 让链表从头开始走到尾,每移动一步,就让k的值减1 ...

随机推荐

  1. SpringCloud微服务小白入门之Eureka注册中心和服务中心搭建示例

    一.注册中心配置文件 代码复制区域: spring: application: name: spring-cloud-server server: port: 7000 eureka: instanc ...

  2. python(自用手册)导图

  3. 开源题材征集 + MVC&EF Core 完整教程小结

    到目前为止,我们的MVC+EF Core 完整教程的理论部分就全部结束了,共20篇,覆盖了核心的主要知识点. 下一阶段是实战部分,我们将会把这些知识点串联起来,用10篇(天)来完成一个开源项目. 现向 ...

  4. 携程PMO--如何召开卓有成效的回顾会

      话题介绍   回顾会提供团队反思迭代过程并提出改进措施的机会.回顾会是团队成员共同进行的协作活动,让团队成员跟进并落实改进措施,使团队在下一个冲刺中更高效,这是相当重要的.   我们给出了回顾会的 ...

  5. CSS3 transform封装

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  6. Azure Devops: COPY failed: stat /var/lib/docker/tmp/docker-builder268095359/xxxxxxx.csproj no such file or directory

    在Azure Devops中部署docker镜像时,  出现COPY failed: stat /var/lib/docker/tmp/docker-builder268095359/xxxxxxx. ...

  7. Python Web 之 Flask

    FLASK 一.概述 flask是一个基于python并依赖于Jinja2模板引擎和WerkZeug WSGI(Web Server Gatewey InterFace.web)服务的框架 WSGI: ...

  8. HTML 事件属性(摘自菜鸟教程)

    HTML 事件属性 全局事件属性 HTML 4 的新特性之一是可以使 HTML 事件触发浏览器中的行为,比方说当用户点击某个 HTML 元素时启动一段 JavaScript. 如果你想学习更多关于事件 ...

  9. ASP.NET Core 3.0中使用动态控制器路由

    原文:Dynamic controller routing in ASP.NET Core 3.0 作者:Filip W 译文:https://www.cnblogs.com/lwqlun/p/114 ...

  10. Calendar常用方法

    import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public class C ...