ldjhust

工欲善其事 必先利其器

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

题目:输入一个单向链表,输出该链表中倒数第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的取值不合理的时候:

链表为空的时候:

posted on 2013-05-01 14:20  ldjhust  阅读(283)  评论(0编辑  收藏  举报