#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
void Min_print(LinkList L){
LNode *p,*q,*pre;
while(L->next){
pre=L;
p=L->next;
while(p->next){ //这里用p->next其实和冒泡排序内层循环,j和j+1比较,j不用走到最后就已经完成了全部比较。
if(p->next->data<p->data)
pre=p; //链表的删除操作,需要用到前一个结点,避免断链
p=p->next;
}
printf("%d",pre->next->data);
q=pre->next;
pre->next=q->next;
free(q);
}
free(L); //最后不要忘记free掉头结点
}
把这道题拿出来是因为不许使用辅助空间,链表这边的题:
1.只提到高效这个要求的,就要考虑到应用辅助空间。
2.不让使用辅助空间的时候,基本就是可以不用考虑时间复杂度。
3.提到高效又尽可能省空间的,基本就是在链表上做操作了,要么是快慢指针,要么是链表就地逆置,也可能是快慢指针配合链表就地逆置。保证空间复杂度在O(1),时间复杂度在O(n)。