【剑指offer】链表中倒数第k个节点,C++实现(链表)
1.题目
输入一个链表,输出该链表中倒数第k个结点。链表的尾节点是倒数第一个节点。
struct ListNode { int val; struct ListNode *next; }
2.思路
两个指针遍历链表:第一个指针从链表的头节点走k-1步,第二个指针不动;从第k步开始,第二个指针也开始从链表的头节点开始遍历,直到第一个指针指向链表结尾。由于两个指针的距离保持k-1,当第一个指针到达链表的尾节点时,第二个指针指向倒数第k个节点。举例:打印有6个节点链表倒数第3个节点。
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 };