【剑指offer】链表中倒数第k个节点,C++实现(链表)

1.题目

      输入一个链表,输出该链表中倒数第k个结点。链表的尾节点是倒数第一个节点。

struct ListNode
{
        int val;
        struct ListNode *next;
}

2.思路

      两个指针遍历链表:第一个指针从链表的头节点走k-1步,第二个指针不动;从第k步开始,第二个指针也开始从链表的头节点开始遍历,直到第一个指针指向链表结尾。由于两个指针的距离保持k-1,当第一个指针到达链表的尾节点时,第二个指针指向倒数第k个节点。举例:打印有6个节点链表倒数第3个节点。

                                                              剑指Offer(十四):链表中倒数第k个结点

3.code

鲁棒性:

1.输入k=0时,输出nullptr

2.输入头指针为空时,输出nullptr

3.输入k大于链表长度时,输出nullptr

功能测试:

1.第k个节点在链表的中间

2.第k个节点是链表的头结点

3.第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         // 查找倒数第0个节点和输入空指针
 13     	if(pListHead == NULL || k == 0){
 14             return NULL;
 15         }
 16 
 17         // 两个指针遍历链表
 18         ListNode *pAhead = pListHead;
 19         ListNode *pBehind = pListHead;
 20 
 21         // 第一个指针从链表的头结点走K-1步
 22         for(unsigned int i = 0; i < k - 1; i++){
 23             if(pAhead->next != NULL){
 24                 pAhead = pAhead->next;
 25             }
 26             else{
 27                 return NULL;
 28             }
 29         }
 30 
 31         // 第k个节点开始,两个指针同时遍历
 32         while(pAhead->next != NULL){
 33             pAhead = pAhead->next;
 34             pBehind = pBehind->next;
 35         }
 36         return pBehind;
 37     }
 38 };
posted @ 2018-03-14 11:22  wanglei5205  阅读(1278)  评论(0编辑  收藏  举报
levels of contents