题目:输入一个链表,输出该链表中倒数第k个结点。
解题:A常规做法是计算出链表长度然后计算出倒数点位置O(n);
B另外做法是用两个指针,一开始一个指针先走k-1步到达第k个节点(要是遇到null直接返回NULL,说明k大于链表长度不合法),然后两个指着再同步往下走,走完即可。(核心是两个指针保持一定长度)。
A常规实现代码:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k)
{
if (pListHead == NULL)
return NULL;
ListNode* p = pListHead;
int ListLen = 0;
while (p)
{
ListLen++;
p = p->next;
}
if (k>ListLen)
return NULL;
p = pListHead;
for (int i = 0; i<(ListLen - k); i++){
p = p->next;
}
return p;
}
B简洁强化版本
ListNode* FindKthToTailPlus(ListNode* pListHead, unsigned int k)
{
if (pListHead == NULL)
return NULL;
ListNode* p1 = pListHead,*p2=pListHead;
for (int i = 0; i<k - 1; i++)
{
if (p1)
p1 = p1->next;
else
return NULL;
}
while (p1->next)//保证p1指向最后一个结点而不是NULL
{
p1 = p1->next;
p2 = p2->next;
}
return p2;
}
测试代码:
int main()
{
ListNode a(1),b(2),c(3);
ListNode* head = &a;
a.next = &b;
b.next = &c;
printf("%d\n", FindKthToTailPlus(head, 2)->val);
while (true)
{
}
return 0;
}