问题描述:
输入一个单向链表,输出该链表中倒数第k个结点,链表的倒数第0个结点为链表的尾指针。
链表结点定义如下:
struct ListNode
{
int m_nKey;
ListNode* m_pNext;
};
详细描述:
接口说明
原型:
ListNode* FindKthToTail(ListNode*pListHead, unsignedint k);
输入参数:
ListNode* pListHead 单向链表
unsigned int k 倒数第k个结点
输出参数(指针指向的内存区域保证有效):
无
返回值:
正常返回倒数第k个结点指针,异常返回空指针
知识点 链表,查找,指针
运行时间限制 10M
内存限制 128
输入
输入说明
1 输入链表结点个数
2 输入链表的值
3 输入k的值
输出
输出一个整数
样例输入 8 1 2 3 4 5 6 7 8 4
样例输出 4
问题分析:要求输出输出该链表中倒数第k个结点,一般有两种思考方式
(1)采用尾插法:输入12345678,列表中存的是 head->1 2 3 4 5 6 7 8 -> null
倒数第k个节点,(倒数0个节点是倒数第一个节点,注意从0开始)
1 2 3 4 5 6 7 8
7 6 5 4 3 2 1 0(k)
输出倒数第k个节点,即从head点开始遍历,循环next。循环次数为n-k,最后输出当前节点的data值即可。
(2)采用头插法:输入12345678,列表中存的是head->8 7 6 5 4 3 2 1->null
输出倒数第k个节点,即从head点开始遍历,循环next,循环次数为k+1次,最后输出当前节点的data值即可。
代码(1)头插法:
#include <iostream>
#define null 0
using namespace std;
typedef struct node
{
int key;
struct node *next;
}node, *linkList;
int main()
{
int n;
cin>>n;
linkList phead;//定义链表头
linkList p;
linkList r=(linkList) malloc(sizeof(struct node));
phead=r;
r->next=null;
//一次输入链表节点值[头插法]
int i=0;
for(i=0;i<n;i++)
{
p=(linkList) malloc(sizeof(struct node));
cin>>p->key;
p->next=r->next;
r->next=p;
}
//输入倒数第k个数的值(k可以为0)
int k;
cin>>k;
if(k>=n)
return 0;
linkList pfw=phead;//定义快慢指针
for(i=0;i<k+1;i++)
{
pfw=pfw->next;
}
cout<<pfw->key<<endl;
return 0;
}
代码(2)尾插法:
#include <iostream>
#define null 0
using namespace std;
typedef struct node
{
int key;
struct node *next;
}node, *linkList;
int main()
{
int n;
cin>>n;
linkList phead;//定义链表头
linkList p;
linkList r=(linkList) malloc(sizeof(struct node));
phead=r;
r->next=null;
//一次输入链表节点值[尾插法]
int i=0;
for(i=0;i<n;i++)
{
p=(linkList) malloc(sizeof(struct node));
cin>>p->key;
r->next=p;
r=p;
}
//输入倒数第k个数的值(k可以为0)
int k;
cin>>k;
if(k>=n)
return 0;
linkList pfw=phead;//定义快慢指针
for(i=0;i<n-k;i++)
{
pfw=pfw->next;
}
cout<<pfw->key<<endl;
return 0;
}