题目:打印单向链表中倒数第k个节点
以下为自己所写代码,未经过验证,只是写个思路。。。
#include<iostream> #include<vector> #include<exception> using namespace std; //节点定义 struct ListNode { int m_nValue; ListNode* m_pNext; }; void FindKthToTail(ListNode* pHead, unsigned int k) { if(pHead == NULL) throw new std::exception("Invalid parameters!"); std::vector<int> Values; ListNode* pNode = pHead; while(pNode != NULL) { Values.push_back(pNode->m_nValue); pNode = pNode->m_pNext; } if(k > Values.size()) throw new std::exception("Invalid parameters!"); else std::cout<<Values[Values.size() - k]<<std::endl; }
如果不允许使用vector,则另想办法:用具有某种限制的两个指针进行一次遍历即可!
自己所写代码如下:
ListNode* FindKthToTail(ListNode* pHead, unsigned int k) { if(pHead == NULL || k <= 0) return NULL; int index = 1; ListNode* pNode = pHead; while(i <= k && pNode != NULL) pNode = pNode->m_pNext; if(pNode == NULL) return NULL; else { ListNode* pNodeFollow = pHead; while(pNode->m_pNext != NULL) { pNode = pNode->m_pNext; pNodeFollow = pNodeFollow->m_pNext; } } return pNodeFollow; }
错误处理后,均return NULL;
让防御性编程成为自己的习惯!