本人是搞java的,因为c++已经搁浅了很多年,但是不管怎么说,用c++写基本的算法还是需要掌握的,我相信自己的努力终将一天会成为自己晋升和成长的最大动力!!!
好了,话不多说,直接贴代码
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
if(pListHead == nullptr || k == 0){
return nullptr;
}
ListNode *pAhead = pListHead;
ListNode *pBhead = nullptr;
for(unsigned int i = 0; i < k - 1; ++i){
if(pAhead->next != nullptr){
pAhead = pAhead->next;
}
else{
return nullptr;
}
}
pBhead = pListHead;
while(pAhead->next != nullptr){
pAhead = pAhead->next;
pBhead = pBhead->next;
}
return pBhead;
}
};
解决了这道题,下面我们进行一些延伸,比如面试官要求我们求出一个链表的中间节点,这时候我们思路肯定觉得这个很简单,盲目计算写代码容易造成错误,我们应该首先分析链表长度的技偶数性,如果链表长度是奇数,我们返回节点的中间节点即可,如果链表长度是偶数,我们返回链表的中间节点的任意一个即可,下面代码其实就是用到了快慢指针,具体代码就不粘贴了,当然很容易,就是快指针每次移动的速度是慢指针的二倍,当快指针到达末尾时候,此时慢指针的位置就是中间节点的位置!!!
快慢指针是一个很经典的问题,比如用来判断链表是否形成环的问题等等,当然判断链表的环节点初始位置涉及到数学问题的证明,这里不予以介绍!
ListNode* FindMidNode(ListNode* pHead)
{
if (pHead == NULL)
{
return NULL;
}
if (pHead->m_pNext == NULL || pHead->m_pNext->m_pNext == NULL)
{
return pHead;
}
ListNode* pFirstNode = pHead;
ListNode* pSecondNode = pHead;
while(pFirstNode->m_pNext!= NULL && pFirstNode->m_pNext->m_pNext != NULL){
pFirstNode = pFirstNode->m_pNext->m_pNext;
pSecondNode = pSecondNode->m_pNext;
}
return pSecondNode;
}