本题是较为容易的一题,只需要将前后两个链表元素的数据大小和要插入的数据进行比较就可得出结论,分为三种情况。情况一:如果小于前面的并且大于等于后面的,即为满足条件,只需要将插入元素的next指向后面的,将前面的next指向要插入元素,就可将元素插入其中;情况二:待插入的数据最小,那么就需要将其插入到头指针后,它的next指向第一个存放数据的元素;情况三:待插入的数据最大,那么就需要将其插入到最后,链表中最后一个元素指向它,它的next置空即可。
问题描述
幼儿园小朋友要玩老鹰捉小鸡的游戏,老师把在场的小朋友按身高递增的顺序排好了队,这时有一位小朋友来晚了,老师需要把他按照身高插入到排好的队列中,请你帮助幼儿园老师把这位晚到的小朋友插入到队列中合适的位置。
输入说明
输入的第1行包含原队列长度N(任意int范围内的非负整数)与待插入的小朋友的身高值M(单位为cm);第2行包含N个递增的小朋友的身高值代表原递增数列。
输出说明
根据此递增数列,构造出递增链表,然后将M插入到链表中,输出插入后的链表对应的数列。数字间隔一个空格,但末尾不能有空格。
输入样例
6 100
99 102 104 105 107 110
输出样例
99 100 102 104 105 107 110
#include<iostream>
#include<cstdio>
#include<malloc.h>
using namespace std;
typedef struct LinkList{
int height;
LinkList *next;
}LinkList;
LinkList* creatList(int num){
LinkList* head, * s, *r;
head=(LinkList*)malloc(sizeof(LinkList)); //生成头节点head
r = head; //尾指针指向头节点
for(int i=0; i<num;i++){
s=(LinkList*)malloc(sizeof(LinkList)); //生成新节点*s
cin>>s->height;
r->next = s; //新节点插入表尾
r = s; //尾指针指向新表尾
}
r->next = NULL;
return head; //返回表头指针
}
int main(){
int num = 0, h;
cin>>num>>h;
if(num==0){ //特殊情况下,没有小朋友,不用排序,直接输入输出
printf("%d", h);
}
else{ //一般情况下,已经排好队了
LinkList *L = creatList(num);
LinkList *p, *r;
p=(LinkList*)malloc(sizeof(LinkList));
p->height = h;
r = L->next;
for(int i=0;i<num;i++){ //三种情况
if(h<r->height){ //当插入的比第一个小时,插到链表第一个
p->next = r;
L->next = p;
break;
}else if((h>r->height)&&(r->next==NULL)) { //当插入的比最后一个大时,插到链表尾
r->next = p;
break;
}else if((h>=r->height)&&(h<r->next->height)&&(r->next!=NULL)){ //一般情况下,插入表中
p->next = r->next;
r->next = p;
break;
}
else{
r = r->next;
}
}
LinkList *q = L->next;
for(int j = 0;j<=num;j++){
// cout<<q->height<<' ';
printf("%d ",q->height);
q = q->next;
}
}
return 0;
}