//腾讯的面试题 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;
}