要了解快慢指针的思想,以及如何实现任意输入,何时停止
#include<stdio.h>
#include<stdlib.h>
//任意输入,排序并输出
typedef struct Node{
int data;
struct Node* next;
}LinkNode;
//初始链表,使用二级指针,没有头节点
void Init(LinkNode** head){
//使用亚节点
int data=0;
LinkNode dummy;
LinkNode* pre = NULL;
LinkNode* temp = NULL;
dummy.next = pre;
pre = &dummy;
printf("请输入数据:");
while(1){
scanf("%d", &data);
//把空格从缓冲区读出
temp = (LinkNode *)malloc(sizeof(LinkNode));
temp ->data = data;
temp->next = NULL;
pre->next = temp;
pre = temp;
if (getchar()=='\n') {
break;
}
}
*head = dummy.next;
}
void swap(int *a, int *b){
int data = 0;
data = *a;
*a = *b;
*b = data;
}
//排序链表,普通的排序,时间复杂度(n*n)
void sortList(LinkNode** head){
LinkNode *pre = (*head), *last = NULL;
if(*head == NULL && (*head)->next == NULL){
return;
}
while(pre->next != NULL){
last = pre->next;
while(last != NULL){
if(pre->data >= last->data){
swap(&(pre->data),&(last->data));
}
last = last ->next;
}
pre = pre ->next;
}
}
//使用快慢指针实现归并排序
//并
LinkNode* Merge_sort(LinkNode *left, LinkNode* right){
if(left == NULL) return right;
else if(right == NULL) return left;
else if(left->data <= right->data){
left->next = Merge_sort(left->next,right);
return left;
}else{
right->next = Merge_sort(left, right->next);
return right;
}
}
//分开,然后归并
LinkNode* merge(LinkNode *head){
//使用快慢指针的特点,递归
LinkNode *slow = head, *fast = head, *pre = head;
//递归终止的条件的条件
if (!head || !head->next) return head;
while( fast != NULL && fast->next != NULL){
pre = slow;
fast= fast ->next->next;
slow = slow ->next;
}
//要将slow后边与前边的断开
pre ->next = NULL;
merge(head);
merge(slow);
return Merge_sort(head,slow);
}
//打印链表
void print(LinkNode *head){
while(head!= NULL){
printf("%d ",head->data);
head = head->next;
}
printf("\n");
}
int main(){
LinkNode* head = NULL;
Init(&head);
print(head);
sortList(&head);
print(head);
printf("快慢指针实现归并排序:");
merge(head);
print(head);
return 0;
}
结果: