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 }