前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++版 - 剑指offer 面试题15: 链表中倒数第k个结点 题解

C++版 - 剑指offer 面试题15: 链表中倒数第k个结点 题解

作者头像
Enjoy233
发布2019-03-05 13:48:53
3130
发布2019-03-05 13:48:53
举报

剑指offer 面试题15: 链表中倒数第k个结点

提交网址:  http://www.nowcoder.com/practice/529d3ae5a407492994ad2a246518148a?tpId=13&tqId=11167

时间限制:1秒   空间限制:32768K 本题知识点:链表

分析: 刚看到此题时,会想到的办法是遍历两次,先用计数器获得链表长度,然后第二次遍历时走到n-k+1结点处即可,这样做时间复杂度为O(n+k); 如果要求只遍历一次,或 时间复杂度就为O(n),那就可以采用两个指针(先后指针,速度相同),pAhead先动,当pAhead到k-1时pBehind开始动,则当pAhead到尾部时,pBehind恰好到倒数第k个结点处。 另外需要注意一点,k是无符号整型的,而下标idx需要与k比较,也设为无符号整型比较好。

#include<iostream>
using namespace std;
struct ListNode {
	int val;
	struct ListNode *next;
	ListNode(int x) :
			val(x), next(NULL) {
	}
};

class Solution{
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k)
	{
    	if(pListHead==NULL || k==0) return NULL;    	
    	ListNode *pAhead,*pBehind;
		pAhead=pListHead;
		pBehind=NULL;
		for(unsigned int idx=0; idx<k-1;idx++)
		{
			if(pAhead->next==NULL) return NULL;
			else pAhead=pAhead->next;			
		}
		pBehind=pListHead;
		while(pAhead->next != NULL)
		{
			pAhead=pAhead->next;
			pBehind=pBehind->next;						
		} 
    	return pBehind;	
    }   
};

// 以下为测试部分
/*
int main()
{
	ListNode *p_head,*kthNode;
	Solution sol;

	p_head=new ListNode(5);
	p_head->next=new ListNode(2);
	p_head->next->next=new ListNode(3);
	p_head->next->next->next=new ListNode(8);
	// p_head=NULL;  // 空结点的情形,上面4个结点都注释掉。
			 
	kthNode=sol.FindKthToTail(p_head, 2);  // 后面的2按测试需求调整
	
	if(kthNode!=NULL) cout<<"The value of kth Node is: "<<kthNode->val<<endl;
	else cout<<"The Node does not exist."<<endl;
	return 0;
}
*/
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年04月16日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档