zoukankan      html  css  js  c++  java
  • 【原创】编程题练习:头插法尾插法建立单链表及找寻单链表中的倒数第K个节点

    边界条件需要注意:两种方法,第一种遍历链表,寻找到节点,然后从头结点开始,寻找第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  }
  • 相关阅读:
    Prometheus学习系列(九)之Prometheus 存储
    Prometheus学习系列(八)之Prometheus API说明
    SSE图像算法优化系列七:基于SSE实现的极速的矩形核腐蚀和膨胀(最大值和最小值)算法。
    Crimm Imageshop 2.3。
    【短道速滑一】OpenCV中cvResize函数使用双线性插值缩小图像到长宽大小一半时速度飞快(比最近邻还快)之异象解析和自我实现。
    【算法随记七】巧用SIMD指令实现急速的字节流按位反转算法。
    【算法随记六】一段Matlab版本的Total Variation(TV)去噪算法的C语言翻译。
    SSE图像算法优化系列三十:GIMP中的Noise Reduction算法原理及快速实现。
    一种快速简便优秀的全局曲线调整与局部信息想结合的非线性彩色增强算法(多图深度分析和探索)
    【算法随记五】使用FFT变换自动去除图像中严重的网纹。
  • 原文地址:https://www.cnblogs.com/xiawen/p/3026666.html
Copyright © 2011-2022 走看看