PAT 3-05 求链式线性表的倒数第K项(C语言实现)
2014-10-03 15:25
483 查看
题目描述:
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
输入格式说明:
输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。
输出格式说明:
输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息“NULL”。
样例输入与输出:
解答说明:
因为是链表,无法知道线性表的长度,也无法返回下标值。
我的做法是,定义两个指针a,b,都指向链表头节点,然后将b向后移k次,再将a,b同时向后移,当b到达链表末尾时a指向的那个节点值即是倒数第K项。注意特殊情况的考虑,比如链表总长度刚好等于K或者小于K等。
源码:
#include<stdio.h>
#include<stdlib.h>
typedef struct node *ptrNode;
typedef ptrNode LinkList; //头结点
typedef ptrNode Position;//中间节点
typedef int ElementType;
struct node{
ElementType Element;
Position next;
};
LinkList creatList(void)
{
LinkList head,r,p;
int x;
head = (struct node*)malloc(sizeof(struct node)); //生成新结点。节点生成很耗时,考虑改掉
r = head;
scanf("%d",&x);
while(x >= 0){
p = (struct node*)malloc(sizeof(struct node));
p->Element = x;
r->next = p;
r = p;
scanf("%d",&x);
}
r->next = NULL;
return head;
}
void printLastKth(LinkList L, int k)
{
Position ha, hb;
int i;
ha = L;
hb = L;
for(i = 0; i < k; i++){
hb = hb->next;
if(hb == NULL)
break;
}
if(hb == NULL)
printf("NULL");
else{
while(hb != NULL){
hb = hb->next;
ha = ha->next;
}
printf("%d",ha->Element);
}
}
void destroyLinkList(LinkList L)
{
LinkList p,q;
p = L->next;
while(p){
q = p->next;
free(p);
p = q;
}
L = NULL;
}
int main(void)
{
LinkList L;
int k;
scanf("%d",&k);
L = creatList();
printLastKth(L, k);
destroyLinkList(L);
return 0;
}
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字。
输入格式说明:
输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理)。
输出格式说明:
输出倒数第K个位置上的数据。如果这个位置不存在,输出错误信息“NULL”。
样例输入与输出:
序号 | 输入 | 输出 |
1 | 4 1 2 3 4 5 6 7 8 9 0 -1 | 7 |
2 | 6 3 6 7 8 2 -2 | NULL |
因为是链表,无法知道线性表的长度,也无法返回下标值。
我的做法是,定义两个指针a,b,都指向链表头节点,然后将b向后移k次,再将a,b同时向后移,当b到达链表末尾时a指向的那个节点值即是倒数第K项。注意特殊情况的考虑,比如链表总长度刚好等于K或者小于K等。
源码:
#include<stdio.h>
#include<stdlib.h>
typedef struct node *ptrNode;
typedef ptrNode LinkList; //头结点
typedef ptrNode Position;//中间节点
typedef int ElementType;
struct node{
ElementType Element;
Position next;
};
LinkList creatList(void)
{
LinkList head,r,p;
int x;
head = (struct node*)malloc(sizeof(struct node)); //生成新结点。节点生成很耗时,考虑改掉
r = head;
scanf("%d",&x);
while(x >= 0){
p = (struct node*)malloc(sizeof(struct node));
p->Element = x;
r->next = p;
r = p;
scanf("%d",&x);
}
r->next = NULL;
return head;
}
void printLastKth(LinkList L, int k)
{
Position ha, hb;
int i;
ha = L;
hb = L;
for(i = 0; i < k; i++){
hb = hb->next;
if(hb == NULL)
break;
}
if(hb == NULL)
printf("NULL");
else{
while(hb != NULL){
hb = hb->next;
ha = ha->next;
}
printf("%d",ha->Element);
}
}
void destroyLinkList(LinkList L)
{
LinkList p,q;
p = L->next;
while(p){
q = p->next;
free(p);
p = q;
}
L = NULL;
}
int main(void)
{
LinkList L;
int k;
scanf("%d",&k);
L = creatList();
printLastKth(L, k);
destroyLinkList(L);
return 0;
}
相关文章推荐
- PAT DS 3-05求链式线性表的倒数第K项
- 浙江大学PAT上机题解析之3-05. 求链式线性表的倒数第K项
- 浙江大学PAT上机题解析之3-05. 求链式线性表的倒数第K项
- pat 3-05. 求链式线性表的倒数第K项(水题)
- PAT 3-05. 求链式线性表的倒数第K项
- 浙大PAT 3-05. 求链式线性表的倒数第K项 (解题思路)
- 3-05. 求链式线性表的倒数第K项(15)(STL list运用 ZJU_PAT)
- Programming Ability Test学习 3-05. 求链式线性表的倒数第K项(15)
- PAT1021. 求链式线性表的倒数第K项(15)
- 线性链表--链式链表实现(c语言)
- C语言 线性表 双向链式结构 实现
- c语言线性表的链式表示和实现
- 求链式线性表的倒数第K项
- 5-19 求链式线性表的倒数第K项 (20分)
- C语言单链表(线性表的链式存储)的实现
- 《数据结构学习与实验指导》3-5:求链式线性表的倒数第K项
- C语言 双向循环链表的实现和结构 链表 线性表的链式实现
- 5-19 求链式线性表的倒数第K项 (20分)
- 线性表链式存储-使用c语言实现
- 线性表的链式存储(单链表)C语言实现