二种方法查找链表倒数第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个结点的主要内容,如果未能解决你的问题,请参考以下文章