《剑指offer》面试题15—输出链表中倒数第n个结点
题目:如题,且从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了说明到链表尾了,肯定没有环;如果有环,由于快指针每次都比慢指针多走一步,快指针最终会追上慢指针(注意这里快指针不会跳过慢指针而不相遇,因为每次只多一步)
《剑指offer》面试题15—输出链表中倒数第n个结点的更多相关文章
- 【剑指offer 面试题15】链表中倒数第K个结点
思路: 定义两个指针同时指向head,第一个指针先走K-1步,随后二个指针同时移动,当第一个指针到末尾处时,第二个指针所指向的即为倒数第K个结点. #include <iostream> ...
- 剑指offer面试题15:链表中倒数第K个节点
题目:输入一个链表,输出该链表的倒数第K个节点.为了符合大多数人的习惯,本题从1开始计数,即链表尾节点是倒数第一个节点. 解题思路: 解法一:一般情况下,单向链表无法从后一个节点获取到它前面的节点,可 ...
- 剑指Offer面试题:12.链表的倒数第K个结点
一 题目:链表的倒数第K个结点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点,从头结点开始它们的值依 ...
- 剑指offer——面试题22:链表中倒数第k个节点
注意代码的鲁棒性! 函数: ListNode* TheLastKthNode(ListNode* pHead,int k) { ) return nullptr; ListNode* quickNod ...
- (剑指Offer)面试题15:链表中倒数第k个结点
题目: 输入一个链表,输出该链表中倒数第k个结点. 例如:链表中有6个结点,从头到尾依次为1,2,3,4,5,6,则该链表的倒数第3个结点为4. 链表结点定义: struct ListNode{ in ...
- 剑指Offer面试题:14.链表的倒数第k个节点
PS:这是一道出境率极高的题目,记得去年参加校园招聘时我看到了3次,但是每次写的都不完善. 一.题目:链表的倒数第k个节点 题目:输入一个链表,输出该链表中倒数第k个结点.为了符合大多数人的习惯,本题 ...
- P107、面试题15:链表中倒数第K个结点
题目:输入一个链表,输出该链表中倒数第K个结点.为了符合大多数人的习惯,本体从1开始奇数,即链表的尾结点是倒数第1个结点.例如一个链表有6个结点,从头结点开始他们的值一次是1.2.3.4.5.6.这个 ...
- 面试题15:链表中倒数第K个结点
输入一个链表,输出该链表中倒数第k个结点. 方法1: 这个解法要循环两次链表 /* public class ListNode { int val; ListNode next = null; Lis ...
- 剑指offer——面试题15:二进制中 1的个数
// 面试题15:二进制中1的个数 // 题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数.例如 // 把9表示成二进制是1001,有2位是1.因此如果输入9,该函数输出2. #inc ...
随机推荐
- Unity3D 调用Java,Java调用Unity3D
1.无返回值 AndroidJavaClass fee = new AndroidJavaClass("com.wiker.Test"); fee.CallStatic(" ...
- jQuery AjaxUpload中文使用API和demo示例
1.AjaxUpload上传插件 浏览器迫使我们使用文件输入控件(<input type=”file” />)做上传,然而此控件的样式是不能修改的.此外,基于表单上传在流行的Ajax应用程 ...
- LookAround开元之旅
http://blog.csdn.net/lancees/article/details/17696805
- crazyflie2.0 RCC时钟知识
因为眼下手里仅仅有16MHZ的2520封装的贴片晶振,8MHZ这样的封装做不到这么小,所以就先用16MHZ,这样我们就须要改动程序相关的RCC时钟: 1,stm32f4xx.h #define HSE ...
- [深入浅出Cocoa]iOS程序性能优化
本文转载至 http://blog.csdn.net/kesalin/article/details/8762032 [深入浅出Cocoa]iOS程序性能优化 罗朝辉 (http://blog.csd ...
- 【BZOJ4293】[PA2015]Siano 线段树
[BZOJ4293][PA2015]Siano Description 农夫Byteasar买了一片n亩的土地,他要在这上面种草. 他在每一亩土地上都种植了一种独一无二的草,其中,第i亩土地的草每天会 ...
- 基于EasyIPCamera实现的RTSP跨平台拉模式转发流媒体服务器
本文转自博客:http://blog.csdn.net/xinlanbobo/article/details/53224445 上一篇博客<EasyIPCamera通过RTSP协议接入海康.大华 ...
- sharding-jdbc源码学习(一)简介
背景 对于大型的互联网应用来说,数据库单表的记录行数可能达到千万级甚至是亿级,并且数据库面临着极高的并发访问.采用Master-Slave复制模式的MySQL架构,只能够对数据库的读进行扩展,而对数据 ...
- ABAP 动态内标排序
动态内表怎样排序动态内表怎样排序 动态内表要排序时,因为不知道内表中的字段名字,所以不能直接用SORT table BY field1 field2... 可以使用下面的方法来实现:SORT tab ...
- CentOS 下源码安装LAMP环境
一.简介 什么是LAMP LAMP是一种Web网络应用和开发环境,是Linux, Apache, MySQL, Php/Perl的缩写,每一个字母代表了一个组件,每个组件就其本身而言都是在它所代 ...