题目:输入一个链表,输出该链表中倒数第k个结点。
struct ListNode{
int m_nValue;
ListNode* m_pNext;
}
方法:定义两个指针。第一个指针从链表的头指针开始遍历向前走k-1,第二个指针保持不动;从第k步开始,第二个指针也开始从链表的头指针开始遍历。由于两个指针的距离保持在k-1,当第一个(走在前面的)指针到达链表的尾结点时,第二个指针(走在后面的)指针正好是倒数第k个结点。
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k){
ListNode *pAhead = pListHead;
ListNode *pBehind = NULL;
for (unsigned int i = 0; i < k - 1; ++ i){
pAhead = pAhead->m_pNext;
}
pBehind = pListHead;
while (pAhead->m_pNext != NULL){
pAhead = pAhead->m_pNext;
pBehind = pBehind->m_pNext;
}
return pBehind;
}
上述代码的bug:
- 输入的pListHead为空指针
- 输入的以pListHead为头结点的链表的结点总数少于k
- 输入的参数k为0
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k){
if (pListHead == NULL || k == 0){
return NULL;
}
ListNode *pAhead = pListHead;
ListNode *pBehind = NULL;
for (unsigned int i = 0; i < k - 1; ++ i){
if (pAhead->m_pNext != NULL){
pAhead = pAhead->m_pNext;
}
else {
return NULL;
}
}
pBehind = pListHead;
while (pAhead->m_pNext != NULL){
pAhead = pAhead->m_pNext;
pBehind = pBehind->m_pNext;
}
return pBehind;
}
测试用例:
- 功能测试(第k个结点在链表的中间,第k个结点是链表的头结点,第k个结点是链表的尾结点)
- 特殊输入测试(链表头结点为NULL指针,链表的结点总数少于k,k等于0)
相关题目:
- 求链表的中间结点,若链表中结点数为奇数,返回中间结点,否则返回任意一个。
- 判断一个单链表是哦福形成环结构。