边界条件需要注意:两种方法,第一种遍历链表,寻找到节点,然后从头结点开始,寻找第n-k+1个节点;第二种方法,两个指针,第一个先走k-1步,然后第二个指针和第一个一起走,到尾节点的时候,第二个指针指向的节点就是倒数第k个节点了。

在程序中两方法没按顺序写。

切记 每次赋值都是赋头指针给p或者q。

  1 #include<iostream>
  2 
  3  using namespace std;
  4 
  5  typedef struct List
  6  {
  7      int data;
  8      struct List *next;
  9  }List;
 10  
 11  void HeadCreatList (List *L)
 12  {
 13      List *s;
 14      L->next=NULL;
 15      for (int i=0;i<10;i++)
 16      {
 17          s=new List;
 18          s->data=i;
 19          s->next=L->next;
 20          L->next=s;
 21      }
 22  }//头插法建立链表
 23  void TailCreatList(List *L)
 24  {
 25      List *s,*r;
 26      r=L;
 27      for (int i=0;i<10;i++)
 28      {
 29          s = new List;
 30          s->data=i;
 31          r->next=s;
 32          r=s;
 33      }
 34      r->next=NULL;
 35  }//尾插法建立链表
 36  void DisPlay(List *L)
 37  {
 38      List *p=L->next;
 39      while(p!=NULL)
 40      {
 41          cout << p->data;
 42          p = p->next;
 43      }
 44      cout << endl;
 45  }
 46 void FindBackKthNode_1(List *L,int k)
 47 {
 48     if(L == NULL)
 49         return ;
 50     List *p,*q;
 51     p = L;
 52     q = L;
 53     int i;
 54     for(i = 0;i<k;i++)
 55     {
 56         if(p->next == NULL)
 57         {
 58             cout << "K is too big" << endl;
 59             return ;
 60         }
 61         else
 62             p = p->next;
 63     }
 64     while(p!=NULL)//p!=NULL保证遍历到最后一个节点
 65     {
 66         p = p->next;
 67         q = q->next;
 68     }
 69     cout << q->data <<endl;
 70 }
 71 void FindBackKthNode_2(List *L ,int k)
 72 {
 73     if(L == NULL)
 74         return ;
 75     List *p = L->next;
 76     int num = 0;
 77     while(p)
 78     {
 79         p = p->next;
 80         num++;
 81     }
 82     if(num<k)
 83     {
 84         cout << "K is too big" << endl;
 85         return ;
 86     }
 87     else if(num == k)
 88     {
 89         p = L->next;
 90         cout << p->data << endl;
 91     }//这种方法的边界条件不好,需要加特殊判断
 92     else if(num > k)
 93     {
 94         p = L;//注意此处要将头结点给p,不然下面的循环条件要改成num-k-1
 95         for(int i = 0;i<num-k;i++)
 96         {
 97             p = p->next;
 98         }
 99         cout << p->data << endl;
100     }
101 }
102  int main()
103  {
104      List *a = new List;
105      List *b = new List;
106      HeadCreatList(a);
107      TailCreatList(b);
108      DisPlay(a);
109      DisPlay(b);
110      FindBackKthNode_1(a,5);
111      FindBackKthNode_2(b,5);
112      system("pause");
113 
114      return 0;
115  }

转载于:https://www.cnblogs.com/xiawen/archive/2013/04/17/3026666.html

【原创】编程题练习:头插法尾插法建立单链表及找寻单链表中的倒数第K个节点...相关推荐

  1. C语言的双向链表头插法和尾插法,指定节点删除

    文章目录 前言 头插法 尾插法 删除节点 测试代码如下 前言 双向链表和单链表的唯一区别就是多个一个指针域而已,该指针域可以访问链表的上一个节点. 关于构造双向链表的过程我们常见的有两种方法,和单链表 ...

  2. C语言的单链表创建:头插法/尾插法

    文章目录 前言 链表头插法 链表尾插法 源码实现 前言 接下来一段时间,将对数据结构进行复习,总的来说数据结构自大学之后忘记得有点吓人,为了防止脑容量本就小得脑袋更小,必须得持续性得温故了. 链表数据 ...

  3. 计算机软件技术 上海电力学院,上海电力学院 计算机软件技术 实验三 用头插法和尾插法创建线性表...

    上海电力学院计算机软件技术实验三用头插法和尾插法创建线性表 #include #define MAXLEN 9 struct table {int key; int othererm; } ; typ ...

  4. 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表

    http://blog.csdn.net/abclixu123/article/details/8210109 链表也是线性表的一种,与顺序表不同的是,它在内存中不是连续存放的.在C语言中,链表是通过 ...

  5. 头插法和尾插法创建链表(有无头结点)

    头插法和尾插法创建链表(有无头结点) 文章目录 头插法和尾插法创建链表(有无头结点) 1 头插法 1.1头插法建表规则: 1.2 头插法建表代码实现 2 尾插法 2.1 尾插法建表规则: 2.2 尾插 ...

  6. 单链表的头插法和尾插法c语言实现

    /*单链表的头插法和尾插法c语言实现*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #d ...

  7. 单链表头插法和尾插法

    1.头插法 头插法:每次把新节点插入到头节点之后,创建的单链表和数据输入顺序相反. 防止单链表是空的而设的. 当链表为空的时候,带头结点的头指针就指向头结点,头结点的指针域存储的数值为NULL. &l ...

  8. C语言头插法尾插法创建单链表

    前言 链表 [Linked List]:链表是由一组不必相连[不必相连:可以连续也可以不连续]的内存结构 [节点],按特定的顺序链接在一起的抽象数据类型. 下面介绍单链表的创建: 创建节点 链表是由一 ...

  9. 采用头插法和尾插法建立单链表

    面说一下如果用C语言建立单链表,分为头插法和尾插法两种. 采用头插法建立单链表 该方法从一个空表开始,生成新结点,并将读取到的数据存放到新结点的数据域中,然后将新结点插入到当前链表的表头,即头结点之后 ...

  10. java实现单链表的建立(头插法和尾插法)

    单链表 单链表(Single Linked List): 单链表是一种链式存取的数据结构,用一组地址任意(可能连续,也可能不连续)的存储单元存放线性表中的数据元素. 链表中的数据是以结点来表示的,每个 ...

最新文章

  1. 《Nature》发布毫米级软体机器人,可在没有任何物理干预情况下游走于人体
  2. 苹果系统怎么降低版本_1903、1809...到底怎么看系统版本?
  3. 商品品牌信息的增删改查操作步骤_javaweb09-Servlet增删改查
  4. odoo pivot中去掉求和_一文读懂深度学习中的卷积运算与图像处理
  5. AI新时代-大神教你使用python+Opencv完成人脸解锁(附源码)
  6. MyBatis框架 多表联合查询实现
  7. 无缝的缓存读取:双存储缓存策略
  8. mysql事务、视图
  9. python如何运行代码_python上怎么跑(运行)代码
  10. poj-3034 Whac-a-Mole
  11. react native环境搭建的一些坑
  12. 2017年 外牌转沪牌 攻略 (沪南路车管所)
  13. 多元线性回归及虚拟变量(哑变量)设置
  14. 针对不同场景的Python合并多个Excel方法
  15. Gradle 插件 + ASM 实战 - 监控图片加载告警
  16. sa提开放系统下的虚拟新贵Virtualbox权技巧之xp_regwrite替换sethc.exe
  17. 服务器温度显示过高,服务器机房温度过高
  18. 深度学习(10)ablation experiments
  19. [Delaunay Triangle] [图形学] C# 实现代码
  20. 分布式对偶平均法(DDA)

热门文章

  1. 如何修复macOS上的Microsoft Edge高CPU和内存使用情况?
  2. Mac切换英文大写,不能锁定,该如何解决
  3. Fragment 源码解析add()和replace()方法
  4. ANDROID模拟器不能启动
  5. 快速备份和还原 MySQL 数据库的另一种方法
  6. android启动之子系统切换
  7. 苏宁数据中台架构实践,高清技术版
  8. 彻底弄懂 Http 缓存机制 - 基于缓存策略三要素分解法
  9. 蚂蚁金服OceanBase“击败”甲骨文?呵呵!
  10. 教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神