题目:输入一个单向链表,输出该链表中倒数第k 个结点。链表的倒数第0 个结点为链表的尾指针。
链表数据结构定义如下:
1 struct LISTNODE 2 { 3 int nData; 4 5 LISTNODE *next; 6 };
思路:用两个指针,第一个指针先走k步,然后第二个指针指向第一个节点,开始和第一个指针一起往后走。
注意:1、我假设这个链表有头节点,若要求链表无头节点,则代码需做修改,但核心思想是一样的
2、注意k的范围,对于k的各种取之给一个合适的反馈。
基于以上分析,写出代码:
1 LISTNODE *GetLastKNode(LISTNODE *head, int k) 2 { 3 assert (head != NULL); 4 5 assert (k >= 0); 6 7 LISTNODE *pPre = head->next; 8 9 if (NULL == pPre) 10 { 11 cerr << "空链表" << endl << endl; 12 exit (1); 13 } 14 15 if (0 == k) 16 { 17 cout << "链表倒数第 " << k << " 个节点是尾指针.\n" << endl; 18 exit (0); 19 } 20 21 while ((pPre != NULL) && (k > 0)) 22 { 23 pPre = pPre->next; 24 --k; 25 } 26 27 if (k > 0) 28 { 29 cout << "K的值大于链表节点的个数.\n\n"; 30 exit (1); 31 } 32 33 LISTNODE *pLast = head->next; 34 35 while (pPre != NULL) 36 { 37 pPre = pPre->next; 38 pLast = pLast->next; 39 } 40 41 return (pLast); 42 }
下面是一些测试结果:
k的取之很合理的时候:
k取值为0的时候:
K的取值不合理的时候:
链表为空的时候: