剑指offer | 链表中倒数第k个结点

先做做一些简单题找找手感,还有赞一个牛客的OJ,这样的提交方式很好,ACM那种对输入出处格式对于没有接触过ACM的人来说比较头疼,华为OJ那种格式描述不清楚的就更头疼了,卡在输入输出上就悲剧了,当然,输入输出也是需要了解的。

顺便吐槽一下华为SO挑战赛:题意有模糊的地方,挑战赛的题目没有区分度,作弊监管太松,判分规则未公开说明。

 

题目描述:输入一个链表,输出该链表中倒数第k个结点。

题目解析:设两个同步后移、相距k的指针就行,前面的指针触底,后面的指针即是倒数k个节点。

代码如下:

 1 /*
 2 struct ListNode {
 3     int val;
 4     struct ListNode *next;
 5     ListNode(int x) :
 6             val(x), next(NULL) {
 7     }
 8 };*/
 9 class Solution {
10 public:
11     ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
12         if(k == 0 || pListHead == NULL) return NULL;
13         ListNode* pFrontNode = pListHead;
14         ListNode* pBehindNode = pListHead;
15         while(--k) {
16             if(pFrontNode->next) pFrontNode = pFrontNode->next;
17             else return NULL;
18         }
19         while(pFrontNode->next) {
20             pFrontNode = pFrontNode->next;
21             pBehindNode = pBehindNode->next;
22         }
23         return pBehindNode;
24     }
25 };

posted on 2015-09-20 22:15  Excavator  阅读(133)  评论(0编辑  收藏  举报

导航