链表中倒数第k个节点

思路1:

先遍历链表一次,统计出链表节点个数n,

然后,倒数第k个节点是,n-k+1。

缺点:该方法需要遍历两次列表。

 

思路2:

定义两个指针,第一个指针向前遍历k-1步,第二个指针保持不动;

从第k步开始,第二个指针从链表头指针开始遍历,当第一个指针到底链表的尾端,第二个指针正好指向倒数第k个节点。

 

注意点:

1.pListHead为空指针

2.pListHead的链表节点数少于k

3.输入参数为0,由于k是一个无符号整数,k-1会得到0xFFFFFFFF,循环次数超过预计

 

 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(pListHead == nullptr || k == 0)
13         return nullptr;
14     ListNode * pAhead = pListHead;
15     ListNode * pBehind = nullptr;
16     
17     for(unsigned int i = 0; i < k-1; i++)
18     {
19         if(pAhead->next != nullptr)
20             pAhead = pAhead->next;
21         else
22         {
23             return nullptr;
24         }
25     }
26         
27     pBehind = pListHead;
28     while(pAhead->next != nullptr)
29     {
30         pAhead = pAhead->next;
31         pBehind = pBehind->next;
32     }
33     return pBehind;
34     }
35 };

 

 

posted @ 2019-11-19 19:58  漫天飘雪  阅读(264)  评论(0编辑  收藏  举报