寻找链表中倒数第k个结点

本文介绍了两种方法找到链表中倒数第k个节点,包括通过遍历两次链表利用栈的方式以及一次遍历使用双指针的方法。第一种方法直观且不易出错,但需要遍历两次;第二种方法更高效,仅遍历一次,但需要注意更多的边界条件。最后提供了《剑指Offer》中简洁的解决方案。
摘要由CSDN通过智能技术生成
//1.相当于遍历链表两次,第一次结点指针全部入栈,第二次找到倒数第k个结点
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) 
{
	//注意防御性编程: 
	//1.如果k大于链表的个数.
	//2.如果k为0
	//3.如果链表为空
	if ( NULL == pListHead || 0 == k )
		return NULL;

	stack<ListNode*> s;

	while ( NULL != pListHead ){
		s.push( pListHead );
		pListHead = pListHead->next;
	}

	if ( s.size( ) < k )
		return NULL;
        
	for ( size_t i = 1; i < k; ++i )
            s.pop( );

	return s.top( );
}


//2.只需遍历链表一次的解法:
//大致思路: 两个指针都指向头节点,第一个指针先在链表上走k-1步,此时第二个指针和第一个指针同时向后走,当第一个指针走到结尾时,第二个指针的指向就是倒数第k个结点。
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k)
{
	if ( NULL == pListHead || 0 == k )
		return NULL;

	size_t count = 0;
	ListNode* pNode1 = pListHead;
	ListNode* pNode2 = pListHead;

	//根据我们思路以及前面判断过的k不等于0. 所以k-1至少为0.
	for ( size_t i = 0; i < k-1; ++i, ++count ){
	
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值