查找单链表中倒数第k个节点,拿到这道题,我们首先肯定能想到先遍历链表得到节点总数n,然后再去从头往后走n-k+1步就能得到想要的节点。这种方法当然是可行的,也是比较容易想到的方法,但是有的宝宝就会想这样做要遍历两次链表,有没有什么方法只遍历一次链表就能找到节点
办法当然还是有的,我们可以利用两个指针遍历链表。刚开始把两个指针pAhead和pBhead都放在链表的头指针处,让pAhead向后走k步,pBhead保持不动,此时两个指针之间的距离就是k-1,然后让两个指针保持间距同时向后走,当pAhead走过链表最后一个节点到达NULL时,pBhead所指向的节点就是我们要找的倒数第k个节点。
下面我用一组图来简单表示一下一次遍历的过程,假设有6个节点,我们要查找倒数第3个。
大概思路搞明白之后,宝宝们还需要注意几个细节使我们的代码更强壮:1、链表可能为空 2、k可能为0 3、链表中节点总数可能小于传入的k
下面附上代码可供参考:
Node* FindKthToTail(Node* pHead, size_t k) //寻找链表中倒数第k个节点
{
if(pHead == NULL || k == 0) //判断传入参数
return NULL;
Node* pAhead = pHead;
Node* pBhead = pHead;
for( size_t i = 0; i < k; ++i )
{
if(pAhead == NULL)
return NULL; //整个链表不足k个节点
pAhead = pAhead->_next;
}
while(pAhead)
{
pAhead = pAhead->_next;
pBhead = pBhead->_next;
}
return pBhead;
}