• 【原创】编程题练习:头插法尾插法建立单链表及找寻单链表中的倒数第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  }
  • 相关阅读:
    java设计模式
    漏桶算法工具类
    http请求requestUtils
    去掉字符串中特殊符号造成的空格
    java 分布式id生成算法
    java枚举
    java 32个Java面试必考点
    配置tomcat下war包可以自压缩
    tomcat (选号)公司tomcat无页面解决
    docker 12 docker容器数据卷
  • 原文地址:https://www.cnblogs.com/xiawen/p/3026666.html
Copyright © 2020-2023  润新知