最近,突然发现周围多了一些杂音,仔细一听,我去居然是广场舞,是时候考虑一下我的暑假计划了………
今天要讲的是关于模拟链表的故事,这个模拟链表很有意思,不知道面试官会不会很亲睐
模拟链表的结构
由两部分组成,分别是数据数组data[]和序号数组right[]
序号数组right[]的作用是记录数据数组中右边的序号
举个例子
right[1]=2;
上面记录的就是数据域序号1旁边是序号2.
当然可能一开始理解有些困难,为了更加方便的理解,我特意画了一幅图:
由上图我们可以很轻松的看出来分别有data数组和right数组,其中红色字体是需要关注的,data中的红色字体为待插入的6,right中的红色字体则是需要改变的,我们不难发现采用模拟链表的插入,时间复杂度瞬间降低到了O(1),只需要调换一下right数组中的位置,即可实现插入。
代码更加清晰
#include<stdio.h>
int main()
{
int data[100],right[100];
int i,n,t;
printf("input the n:");scanf("%d",&n);
for(i=1;i<=n;i++)
{
printf("data[%d]=",i);
scanf("%d",&data[i]);
}
for(i=1;i<=n;i++)
{
if(i!=n)
right[i]=i+1;
else right[i]=0;
}
printf("input the insert:");
scanf("%d",&data[n+1]);
t=1;
while(t!=0)
{
if(data[right[t]]>data[n+1])
{
right[n+1]=right[t];
right[t]=n+1;
break;
}
t=right[t];
}
printf("the numbers:\n");
t=1;
while(t!=0)
{
printf("%d ",data[t]);
t=right[t];
}
return 0;
}
效果图
小结
这个模拟链表确实是十分的精悍,最起码我看了好一会儿才摸清它的套路,重点就是一定要理解right数组的含义,这很重要。