回 帖 发 新 帖 刷新版面

主题:一道小题把我考倒。。

试用顺序表作为存储结构,实现线性表(a0,a1,…,an-1)就地逆置的操作,所谓"就地"指辅助空间应为O(1)。

回复列表 (共8个回复)

沙发

可以定义一个指针,指最后面的结点,让最后面的结点的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; //最后一个结点为头结点
//这里只是伪代码,还要考虑有没有头结点等等

板凳

人家要的是顺序表的,楼上的给了链表的解答,显然不符合题意。
因为顺序表是随机存取的存储结构的,所以其实只要 a[i]←→a[n-1-i]就可以了。

3 楼

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 楼

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 楼

在i<=n/2的时候把a[i] 和a[n-i-1]交换!

6 楼

额,什么意思啊?????????????????????这些真难懂!!!

7 楼


很简单啊!!!!!!只要申明三个结点,然后用循环就可以了!!!!!!!!
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 楼

首尾向中间依次做两两交换

我来回复

您尚未登录,请登录后再回复。点此登录或注册