输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。
请看下面一段代码
class Solution
{
public:
ListNode* getKthFromEnd(ListNode* head, int k)
{
if (head == nullptr || k == 0)
{
return nullptr;
}
ListNode* CurrentNode = head;
for (int i = 0; i < k; i++)
{
CurrentNode = CurrentNode->next;
}
while (CurrentNode)
{
//此时CurrentNode比head多走K个节点
CurrentNode = CurrentNode->next;
head = head->next;
}
return head;
}
};
上面的代码其实存在一些问题,如果以head为头结点的链表的节点数小于K,此时可能由于空指造成程序崩溃
优后的代码(增强了鲁棒性)
class Solution
{
public:
ListNode* getKthFromEnd(ListNode* head, int k)
{
if (head == nullptr || k == 0)
{
return nullptr;
}
ListNode* pHead = head;
ListNode* pNode = head;
for (int i = 0; i < k - 1; i++)
{
if (pHead->next != nullptr)
{
pHead = pHead->next;
}
else
{
return nullptr;
}
}
while (pHead->next != nullptr)
{
pHead = pHead->next;
pNode = pNode->next;
}
return pNode;
}
};