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

Posted 王朝马汉

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二种方法查找链表倒数第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\n",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结点\n",k);
 68     else if(k>len)
 69         printf("查询的结点数大于链表长度,不存在该结点\n");
 70     else
 71     {
 72         head = head->next;
 73         while(head)
 74         {
 75             if(i == len-k+1)
 76             {
 77                 printf("倒数第%d结点数据 = %d\n",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结点\n",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\n",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("请输入要查找的结点\n");
123     scanf("%d",&k);
124     lookNode(head,len,k);
125 
126     return 0;
127 }

 

以上是关于二种方法查找链表倒数第K个结点的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法-链表查找倒数第K个值

查找链表中倒数第k个结点

链表中获取倒数第K个结点

代码的鲁棒性:链表中倒数第k个结点

014 链表中倒数第k个结点

链表中倒数第K个结点