先将键盘输入的一组整数依次存入单链表,然后删除其中的最大最小元素,最后将其余元素逆序输出。
样例输入
1 2 3 4 5 6
样例输出
5 4 3 2
先将键盘输入的一组整数依次存入单链表,然后删除其中的最大最小元素,最后将其余元素逆序输出。
样例输入
1 2 3 4 5 6
样例输出
5 4 3 2
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node *next;
}Node;
void reverse_print(Node *head){
if(head == NULL) return;
reverse_print(head->next);
printf("%d ",head->data);
}
//遍历链表,找到最大值和最小值的前一个节点
Node *delete_max_min(Node *head){
if(head == NULL) return head;
//注意:min和max记录的是最值的前一个节点,第一个值除外.
//注意: min和max不要同时寻找,因为有可能最小值和最大值相邻,这样删除操作麻烦
Node *min = head;
Node *current = head;
while(current->next != NULL){
if(current->next->data < min->data){
min = current;
}
current = current->next;
}
if(min == head){
Node *delete_node = head;
head = head->next;
free(delete_node);
}else{
Node *delete_node = min->next;
min->next = delete_node->next;
free(delete_node);
}
//再判断一遍head是否为空
if(head == NULL) return head;
Node *max = head;
current = head;
while(current->next != NULL){
if(current->next->data > max->data){
max = current;
}
current = current->next;
}
if(max == head){
Node *delete_node = head;
head = head->next;
free(delete_node);
}else{
Node *delete_node = max->next;
max->next = delete_node->next;
free(delete_node);
}
return head;
}
Node *insert(Node *head, Node *node, int index){
if(head == NULL){
if(index != 0){
return head;
}
head = node;
return head;
}
if(index == 0){
node->next = head;
head = node;
return head;
}
Node *current_node = head;
int count = 0;
while(current_node->next != NULL && count < index - 1){
current_node = current_node->next;
count++;
}
if(count == index - 1){
node->next = current_node->next;
current_node->next = node;
}
return head;
}
int main(){
int n;
Node *linkedlist = NULL;
int i = 0;
do{
scanf("%d",&n);
Node *node = (Node *)malloc(sizeof(Node));
node->data = n;
node->next = NULL;
linkedlist = insert(linkedlist,node,i++);
}while(getchar() != '\n');
reverse_print(linkedlist);
printf("\n");
linkedlist = delete_max_min(linkedlist);
reverse_print(linkedlist);
printf("\n");
return 0;
}