题目描述
输入一个链表,输出该链表中倒数第K个结点。
题目分析
定义 2 个指针 p 和 q,让p指针先跑,并且记录节点数,当p指针跑了k-1个节点后,q指针再跑,
当p指针跑到最后时,q 所指指针就是倒数第k个节点。
测试代码
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <assert.h> 4 5 NODE * alloc_one_node() 6 { 7 NODE * load = NULL; 8 9 load = malloc(sizeof(NODE)); 10 assert(load != NULL); 11 load->next = NULL; 12 13 return load; 14 } 15 16 NODE * creat_linked() 17 { 18 NODE * load = NULL; 19 20 load = alloc_one_node(); 21 22 return load; 23 } 24 25 NODE * linked_end(NODE * head) 26 { 27 NODE * load = head; 28 29 while(load->next != NULL) 30 { 31 load = load->next; 32 } 33 34 return load; 35 } 36 37 NODE * add_new_linked(NODE * head, int date) 38 { 39 NODE * new = NULL; 40 NODE * load = linked_end(head); 41 42 new = alloc_one_node(); 43 new->date = date; 44 load->next = new; 45 46 return load; 47 } 48 49 void print_one_node(NODE * load) 50 { 51 printf("%d ", load->date); 52 } 53 54 void print_all_node(NODE * head) 55 { 56 NODE * load = head; 57 58 while(load->next != NULL) 59 { 60 load = load->next; 61 print_one_node(load); 62 } 63 putchar('\n'); 64 } 65 66 void print_kth_tail(NODE * head, int k) 67 { 68 NODE * p, *q; 69 70 p = q = head; 71 while (p->next != NULL) 72 { 73 while(k-- > 1) 74 { 75 p = p->next; 76 } 77 p = p->next; 78 q = q->next; 79 } 80 print_one_node(q); 81 putchar('\n'); 82 } 83 84 int main(void) 85 { 86 NODE * head = NULL; 87 88 head = creat_linked(); 89 add_new_linked(head, 1); 90 add_new_linked(head, 2); 91 add_new_linked(head, 3); 92 add_new_linked(head, 4); 93 add_new_linked(head, 5); 94 95 print_all_node(head); 96 print_kth_tail(head, 5); 97 98 return 0; 99 }