主题:一道小题把我考倒。。
jq2008
[专家分:0] 发布于 2006-09-08 16:44:00
试用顺序表作为存储结构,实现线性表(a0,a1,…,an-1)就地逆置的操作,所谓"就地"指辅助空间应为O(1)。
回复列表 (共8个回复)
沙发
linyuetian [专家分:310] 发布于 2006-09-09 10:37:00
可以定义一个指针,指最后面的结点,让最后面的结点的next指向倒数第二个,倒数第二个的next指向倒数第三个,以此类推;
typedef struct link
{
int data;
struct link next;
}linklist;
linklist *ppt,*ppt2;
ppt=head; //ppt指向队头
ppt2=head->next; //ppt2指向下一个结点
ppt->next=NULL; //头结点的next变为NULL,变为队尾
while(ppt2!=NULL)
{
ppt2->next=ppt;
ppt2=ppt->next;
ppt=ppt->next;
}
head=ppt; //最后一个结点为头结点
//这里只是伪代码,还要考虑有没有头结点等等
板凳
leolhc [专家分:430] 发布于 2006-09-10 16:38:00
人家要的是顺序表的,楼上的给了链表的解答,显然不符合题意。
因为顺序表是随机存取的存储结构的,所以其实只要 a[i]←→a[n-1-i]就可以了。
3 楼
蓝色秋雨 [专家分:0] 发布于 2006-09-10 22:17:00
typedef struct {
int *elem;
int length;
}SqList;
void reverse(SqList &L)
{
for (i = 0,j = L.length; i < j; ++i,--j) { temp = L.elem[i]; L.elm[i]=L.elm[j];L.elem[j]=temp;}
}
4 楼
蓝色秋雨 [专家分:0] 发布于 2006-09-10 22:19:00
typedef struct {
int *elem;
int length;
}SqList;
void reverse(SqList &L)
{
for (i = 0,j = L.length - 1; i < j; ++i,--j) {
temp = L.elem[i];
L.elm[i]=L.elm[j];
L.elem[j]=temp;
}
}
5 楼
chenyinjing [专家分:150] 发布于 2006-09-15 15:04:00
在i<=n/2的时候把a[i] 和a[n-i-1]交换!
6 楼
563409036 [专家分:0] 发布于 2007-10-27 11:01:00
额,什么意思啊?????????????????????这些真难懂!!!
7 楼
ghl116 [专家分:0] 发布于 2007-10-27 23:12:00
很简单啊!!!!!!只要申明三个结点,然后用循环就可以了!!!!!!!!
void linklist::reverse(){
int array[1000];
linklist*current;
if(first==NULL||first->link==NULL){
cout<<"不可以反转链表;"<<endl;
return ;
}
current=first;
int i=0;
for(;current!=NULL;i++){
array[i]=current->info;
current=current->link;
}
current=first;
i=i-1;
for(;current!=NULL;i--){
current->info=array[i];
current=current->link;
}
}
然后就OK了!!!!!!!!!
真的,我试过!!!!!!!!!!!!!
8 楼
bpttc [专家分:8790] 发布于 2007-10-30 14:20:00
首尾向中间依次做两两交换
我来回复