【问题】输入一个链表,输出该链表中倒数第k个结点。

【思路】如果使用常规思维,那么我们需要遍历一次链表,然后再返回倒数第K个结点。如果K为节点长度的话,就需要遍历两次节点了,显然这种方法是不可取的!因此我们可以使用两个指针(前指针和后指针),前指针先移动k个节点,然后两者再一起移动,则后指针指向的节点为所求节点!

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