题目:如题,且从1开始计数。

思路:要求只遍历一遍链表:设置两个指针,一个先走n步后另一个开始同步后移,当快指针已经到链表尾时慢指针正好到要输出的结点。

注意:本题思路比较好想到,主要考察的是代码的鲁棒性!要判断输入参数是否尾空指针,以及n是否有效。

 #include <iostream>
using namespace std; class Node
{
public:
Node(int v, Node* n)
{val = v;
next = n;}
~Node(){}
int val;
Node* next;
};
Node * phead = NULL; void AddNode(int val)
{
Node* pnode = new Node(val,NULL);
//Node one_node(val,NULL); 这里有大bug!如果这样写,在函数退出时自动调用析构函数!链表就乱了!
if(phead == NULL)
{
phead = pnode;
}
else
{
Node* p = phead;
while(p->next != NULL)
{
p = p->next;
}
p->next = pnode;
}
}
void PrintLink()
{
Node* p = phead;
while(p != NULL)
{
int temp = p->val;
cout<<temp<<endl;
p = p->next;
}
} Node* FindNthFromTail(int n) //n >= 1, linklist counts from 1 to n
{
Node* pfast;
Node* pslow;
if(phead == NULL)
{
cout<<"Empty Link!"<<endl;
return NULL;
}
else if(n<=)
{
cout<<"Illegal N!"<<endl;
return NULL;
}
else
{
pfast = phead;
pslow = phead;
for(int i=; i<n; i++)
{
if(pfast->next != NULL)
pfast = pfast->next;
else
{
cout<<"Illegal N!"<<endl;
return NULL;
}
}
while(pfast->next != NULL)
{
pslow = pslow->next;
pfast = pfast->next;
}
return pslow;
}
} int main()
{
int val,n,flag;
Node* pfind;
cin>>val;
while(val != )
{
AddNode(val);
cin>>val;
}
PrintLink();
cout<<"Input the node number you want to find form tail:"<<endl;
cin>>n;
pfind = FindNthFromTail(n);
if(pfind)
{
cout<<"Find!"<<endl<<"The key value is:"<<pfind->val<<endl;
}
return ;
}

举一反三:

1.求链表的中间结点:两个指针,一个每次两步,另一个每次一步。当快指针到链表尾时满指针正好到中间。

2.判断一个链表是否形成环结构:两个指针,一个每次两步,另一个每次一步。如果快指针遇到NULL了说明到链表尾了,肯定没有环;如果有环,由于快指针每次都比慢指针多走一步,快指针最终会追上慢指针(注意这里快指针不会跳过慢指针而不相遇,因为每次只多一步)

最新文章

  1. solr教程
  2. JavaWeb 命名规则
  3. ViewData和TempData以及Session的小结
  4. 如何利用ArcGIS Engine接口实现打开Raster Catalog中的某一幅指定的影像?
  5. RecyclerView的基本创建
  6. Delphi模式设计
  7. Java日期时间使用(转)
  8. 关于单选按钮在提交时获取所选择的选项得value值问题
  9. QML Flipable、Flickable和状态与动画 上篇
  10. js监听浏览器离开页面操作
  11. [知识梳理]课本1&amp;2.1-2.5
  12. Python爬虫5-利用usergent伪装访问方式
  13. python selenium简单安装及使用
  14. ThinkPhp框架分页查询和部分框架知识
  15. OLED屏幕那些次像素有趣的排列方式
  16. 20165303学习基础和C语言基础调查
  17. 基于Elasticsearch的智能客服机器人
  18. PHP正则自动验证传入数据
  19. shell 求模
  20. 使用CAReplicatorLayer [1]

热门文章

  1. H5 手机横竖屏判读
  2. svn服务器迁移(windows下)
  3. 【转】IDA Pro7.0使用技巧总结
  4. ABAP读取工单状态 STATUS_READ
  5. HZNU 与班尼特·胡迪一起攻破浮空城 【DP】
  6. ARM编译器中预定义的宏
  7. javascrip中ajax
  8. APP测试走过的那些坑
  9. FFmpeg滤镜代码级分析
  10. 基于logstash+elasticsearch+kibana的日志收集分析方案(Windows)