-
给定n个数据元素,逐个输入,建立一个有序单链表的时间复杂度是o(n^2)
-
设线性表非空,可以在o(1)时间内在表尾插入一个新结点的方法有:
-带表头结点的单循环链表,一个链表指针指向表头结点(在表头结点后插入一个新结点然后交换这个结点与表头结点);
-不带表头结点的单循环链表,一个链表指针指向表的第一个节点。 -
若要在o(1)时间复杂度上实现两个循环单链表头尾相接,则对应两个循环单链表应设置一个指针,分别指向各自的尾结点。
-
若需要对线性表中保存的无序数据按关键字进行查找,顺序表、动态链表、静态链表的查找效率没有区别。
题目:线性表中元素递增有序且按顺序存储于计算机内。设计算法完成下述功能:用最少时间把所有值为负数的元素移到全部正数值元素前边的算法。
int Rearrange(int a[],int n){
int i=0,j=n-1;//i,j初始指向线性表的第一个和第n个元素
int t=a[0];//暂存枢轴元素
while(i<j){
while(a[j]>0) j--;//如果当前元素大于0,j前移
a[i]=a[j];
i++;//负数前移
while(a[i]<0) i++;//如果当前元素小于0,i后移
a[j]=a[i];
j--;//正数后移
}
a[i]=t;//将第一元素放到最终位置
}
- 时间复杂度为o(n),空间复杂度为o(1)
题目:已知不带头结点的线性链表list,请写一算法,将该链表按节点数据域的值的大小从小到大重新连接。要求链接过程中不得使用除该链表以外的任何链结点空间。
【分析】链表的排序采用直接排序比较方便,即首先假定第一个节点有序,然后从第二个节点开始,依次插入到前面有序链表中,最终达到整个链表有序。
LinkList LinkListSort(LinkList& list){//list是不带头结点的线性链表
LNode* p=list->next;//p是工作指针,指向待排序的当前元素
list->next=NULL;//假定第一个元素有序,即链表中现在只有一个结点
while(p!=NULL){
r=p->next;//r是p的后继
q=list;
if(q->data>p->data){//处理待排序结点p比第一个元素结点小的情况
p->next=list;
list=p;//链表指针指向最小元素
}
else{//查找元素值最小的结点
while(q->next!=NULL&&q->next->data<p->data)
q=q->next;
p->next=q->next;//将当前排序结点插入有序链表中
q->next=p;
}
p=r;//p指向下一个待排序结点
}
}
LinkList LinkListSort(LinkList& list){//list是带头结点的线性链表
LNode* p=list->next;//p指向第一个元素结点
list->next=NULL;//链表初始化为空
while(p!=NULL){
r=p->next;//保存后继
q=list;
while(q->next!=NULL&&q->next->data<p->data)
q=q->next;
p->next=q->next;//将当前排序结点插入有序链表中
q->next=p;
p=r;//p指向下一个待排序结点
}
}
题目:Head为一个包含n个数据元素的带头结点的单链表,P1是一个包含整数(小于n)的递增的有序链表。编写一个算法,它将从Head中删除P1中所有整数所代表的序号的元素。例如:Head={a1,a2,a3,a4,a5,a6,a7},P1={1,4,6},则删除后的Head={a2,a3,a5,a7}
【分析】本题涉及到的基本操作有:链表的遍历、按值查找、删除等。
delete(LinkList &Head,LinkList P1){
LNode*s=Head,*p=P1,*q;
int i=1;//表示s后继元素的序号
while(p){
for(;i<p->data;i++)
s=s->next;//将s移到要删除元素的前驱位置
q=s->next;
s->next=q->next;//删除s的后继元素
free q;
i++;
p=p->next;
}
}