算法实现:返回单链表的倒数第pos个节点

//腾讯的面试题 2015-04-14
//转载自:http://blog.chinaunix.net/uid-23629988-id-2169046.html?page=2
#include <iostream>
#include <ctime>
#include <vector>
using namespace std;


//建立一个链表
struct Node
{
	int data;
	Node *next;
};

//函数功能创建一个链表,并顺序的输出所有值
void CrateLink(Node *&head ,const int n)
{
	head = new Node;
	head->next = NULL;
	head->data = rand()%10000;

	Node *p ,*pr;
	p = head;
	pr = p;
	int i = n;
	i --;
	while(i--)
	{
		p->next = new Node;
		pr = p->next;
		p = pr;
		pr->next = NULL;
		pr->data = rand()%10000;
	}

	p = head;
	while(NULL != p )
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;

}
/*
参数解释
	head 表示链表的头
	pos 表示倒数第pos个值
	d 表示包含返回值的节点

算法的思想就是 利用两个指针 ret 和 head,
这两个指针之间的关系是 head指向的节点大于ret指向的节点 pos个值,即两个指针相差pos个节点
当head指向最后一个值时,ret就为倒数第pos个节点 
*/

void find(Node *head,int pos,Node &d) //找到倒数第pos个值 
	                                 // 注意pos的值和数组的下标的意义是一样的,第0个就是array[n]
{
	int i = 0;
	Node *ret = head;
	while(i<pos && head != NULL) //head向后移动pos个节点,同时检查链表的值是否满足个数
	{
		head = head->next;
		i++;
	}
	if(head == NULL ) //检查链表是否有 倒数第 pos个节点
		return ;

	while(head->next != NULL)
	{
		ret = ret->next;
		head = head->next;
	}
	d.data = ret->data;
}
int main()
{
	Node *head =NULL ;	
	CrateLink(head ,10);
	Node d;
	find(head,2,d); //显示倒数第 2 个节点
	cout << d.data << endl;
	return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值