查找单链表中倒数第k个节点

查找单链表中倒数第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;
}


  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值