• 二种方法查找链表倒数第K个结点


      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 /*
      4 题目:查找链表中倒数第K个结点,K>0
      5 思路1:考虑 链表为空,K<链表长度,k>大于链表长度 这三种情况
      6       1.链表为空,即:不存在倒数第K个结点
      7       2.k>len.即:不存在倒数第K个结点。
      8       3.k<len.倒数第二个结点为正数第len-1(len-2+1)个结点,倒数第三个结点为正数第len-2(len-3+1)个结点,那么倒数第K个结点为正数第len-k+1个结点
      9 思路2:定义二个指针,指向头结点,第一个指针先遍历到第K个结点,他们之间相差K-1个结点。此时两个指针一起往前走,当第一指针指向链尾下一个结点时,
     10        第二个指针正好指向倒数第K个结点
     11 
     12        示例 找倒数第4个结点:  头结点 1 2 3 4 5 6 7 8 9 10    p2先指向第4个结点
     13                               p1(差3个JD)p2
     14                 此时p1 p2,同时往前走,当p2指向尾结点下一个结点的时候,p1正好指向倒数第4个数
     15                               头结点 1 2 3 4 5 6  7    8    9   10
     16                                                  p1(差3个JD)      p2
     17 */
     18 typedef struct node
     19 {
     20     int data;
     21     struct node * next;
     22 }NODE;
     23 NODE * createList()
     24 {
     25     NODE * head = (NODE *)malloc(sizeof(NODE));
     26     head->next = NULL;
     27 
     28     return head;
     29 }
     30 void insertNode(NODE *head,int insertData)
     31 {
     32     NODE * sur = (NODE *)malloc(sizeof(NODE));
     33     sur->data = insertData;
     34 
     35     sur->next = head->next;
     36     head->next = sur;
     37 
     38 }
     39 void traverList(NODE *head)
     40 {
     41     int i = 1;
     42     head = head->next;
     43     while(head)
     44     {
     45         printf("第%d结点 = %d
    ",i,head->data);
     46         head = head->next;
     47         i++;
     48     }
     49 }
     50 int lenList(NODE *head)
     51 {
     52     int len = 0;
     53     head = head->next;
     54     while(head)
     55     {
     56         len++;
     57         head = head->next;
     58     }
     59     return len;
     60 }
     61 /*
     62 //思路一:
     63 void lookNode(NODE *head,int len,int k)
     64 {
     65     int i = 1;
     66     if(head->next == NULL || k<=0)
     67         printf("链表为空,或者查询的结点不存在。不存在倒数第%d结点
    ",k);
     68     else if(k>len)
     69         printf("查询的结点数大于链表长度,不存在该结点
    ");
     70     else
     71     {
     72         head = head->next;
     73         while(head)
     74         {
     75             if(i == len-k+1)
     76             {
     77                 printf("倒数第%d结点数据 = %d
    ",k,head->data);
     78                 break;
     79             }
     80             i++;
     81             head = head->next;
     82         }
     83     }    
     84 }
     85 */
     86 //思路二:
     87 void lookNode(NODE *head,int len,int k)
     88 {
     89     int i = k;
     90     NODE * p1,* p2;
     91     p1 = p2 = head;
     92     if(k>len||k<=0)
     93     {
     94         printf("链表为空,或者查询的结点不存在。不存在倒数第%d结点
    ",k);
     95         return ;
     96     }
     97 
     98     //p2先指向第K个结点
     99     while(k>=1)
    100     {
    101         p2 = p2->next;
    102         k--;
    103     }
    104     //p1,p2同时往前走,当p2指向尾结点下一个结点的时候(此时p2为NULL),p1正好指向倒数第K个结点
    105     while(p2)
    106     {
    107         p1 = p1->next;
    108         p2 = p2->next;
    109     }
    110     printf("倒数第%d个结点数据 = %d
    ",i,p1->data);
    111     
    112     return ;
    113 }
    114 int main(void)
    115 {
    116     NODE * head = createList();
    117     for(int i = 0;i<50;i++)
    118         insertNode(head,rand()%100);
    119     traverList(head);
    120     int len = lenList(head);
    121     int k;
    122     printf("请输入要查找的结点
    ");
    123     scanf("%d",&k);
    124     lookNode(head,len,k);
    125 
    126     return 0;
    127 }
  • 相关阅读:
    Silverlight DataGrid 获取 Row 左键双击事件
    数据结果集拼接到一行
    程序“[6040] iisexpress.exe”已退出,返回值为 0 (0x0)。
    新手用WPF山寨QQ管家7.6(二)
    风向十六方位图和温度湿度图
    新手向使用XAML画出Win8风格图标的照相机,小姐你相机~~
    新手用WPF山寨QQ管家7.6(一)
    实验一
    实验5
    实验4
  • 原文地址:https://www.cnblogs.com/wangchaomahan/p/9734408.html
Copyright © 2020-2023  润新知