《Cracking the Coding Interview程序员面试金典》----链表中倒数第k个结点



时间限制:1秒  空间限制:32768K  热度指数:19220
本题知识点:  链表
 算法知识视频讲解

题目描述

输入一个链表,输出该链表中倒数第k个结点。


思路:

1.本文所给的方法中,先遍历整个List,看有多少元素;再用总元素减去要求的倒数第k个元素的k;再遍历一下list直到遇到cout-k个元素,打印出来 2.还有一种比较聪明的方法,建立两个ListNode节点,第一个节点先走k步,第二个节点再开始走;当第一个节点走到末尾的时候,第二个节点整好会走到count-k的位置。



#include<iostream>
#include<fstream>
#include<string>
#include<cctype>
#include <vector>
#include<exception>
//#include <initializer_list>
#include<stack>
using namespace std;
#define N 4
//链表定义
struct ListNode {
	int val;
	struct ListNode *next;

	ListNode(int x) :
		val(x), next(NULL) {
	}
};
class Solution {
public:
	ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
		//   ListNode temp(0);
		int count = 0;
		ListNode *temp = pListHead; //注意,不能返回临时变量,因为临时变量的生存期只在此函数内

		while (pListHead != NULL) //统计节点个数
		{
			++count;
			pListHead = pListHead->next;

		}
		count -= k;
		pListHead = temp;

		//注意:要判断要找的节点是否在范围内,如果在范围内,返回节点;如果不在,返回NULL
		if (count >= 0)
		{
			while (count--) //从前往后再次搜索
			{
				pListHead = pListHead->next;
			}
			return pListHead;
		}
		else
			return NULL;

	}
};


int main()
{
	int num, i;
	Solution so;
	cout << "请输入头结点:";
	cin >> num;
	ListNode *p, *root;
	root = (ListNode *)malloc(sizeof(ListNode));
	root->next = NULL;
	root->val = num;
	p = root;
	//建立
	cout << "依次输入后面的元素:";
	while (cin >> num)
	{
		ListNode *k = (ListNode *)malloc(sizeof(ListNode));
		k->val = num;
		k->next = NULL;
		p->next = k;
		p = p->next;
		if (k->val == 4)//节点是4就结束
			    break;
	}
	//输出
	p = root;
	cout << "依次输出各个元素是:" << endl;
	while (p->next != NULL)
	{

		cout << p->val << " ";
		p = p->next;
		if(p->val == 4)
        {
            cout << p->val << " ";
		p = p->next;
		break;
        }
	}
	cout << endl;
	ListNode result = *(so.FindKthToTail(root, 3));

	cout << "倒数第" << 3 << "个元素是:" << result.val << endl;
	return 0;
}

不懂的可以加我的QQ群:261035036(IT程序员面试宝典

群) 欢迎你到来哦,看了博文给点脚印呗,谢谢啦~~



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值