Algorithm 创建包含具有特定显示顺序的其他列表元素的列表

Algorithm 创建包含具有特定显示顺序的其他列表元素的列表,algorithm,linked-list,Algorithm,Linked List,考虑一个单链接列表L,其中每个元素都是一个包含两个字段的结构,一个整数num,一个指向列表下一个元素的指针next 描述一种算法,该算法获取指向列表L的第一个元素的指针作为参数,并创建一个新的列表L',该列表L'将包含按以下方式排序的L的所有元素: 对于字段num为奇数的L元素,必须在字段num为偶数的所有元素之前出现在L'中。字段num中带有奇数的元素应保留在L'中,它们在初始列表L中的显示顺序 对于字段num中具有偶数的元素,也应如此 例如,如果初始列表是L=13->15->20->17->

考虑一个单链接列表L,其中每个元素都是一个包含两个字段的结构,一个整数
num
,一个指向列表下一个元素的指针
next

描述一种算法,该算法获取指向列表L的第一个元素的指针作为参数,并创建一个新的列表L',该列表L'将包含按以下方式排序的L的所有元素:

对于字段
num
为奇数的
L
元素,必须在字段
num
为偶数的所有元素之前出现在L'中。字段
num
中带有奇数的元素应保留在
L'
中,它们在初始列表
L
中的显示顺序

对于字段
num
中具有偶数的元素,也应如此

例如,如果初始列表是
L=13->15->20->17->24->26->9->30->53->44
,则最终列表应该是
L'=13->15->17->9->53->20->24->26->50->44

这就是我尝试过的:

struct node{
    int num;
    struct node next;
 }Node;

List(L){
  if (L==NULL) return;
  Node *p=NULL, *q=L, *l=L, *L3=NULL, *head2=NULL, *tail1=NULL, *tail2=NULL;
  while (q!=NULL){
        if (q-> num mod 2==1){
            if (p==NULL){
               p->num=q->num;
               L3=p;
            }
            else {
               p=p->next;
               p->num=q->num;
           }
        }
        q=q->next;
  }
  tail=p;
  while (l!=NULL){
        if (l-> num mod 2==0){
           if (l==NULL){
               l->num=q->num;
               head2=l;
            }
            else {
               l=l->next;
               l->num=q->num;
           }
        }
  }
  tail2=q;
  tail1->next=head2;
  tail1=tail2;
  return L3;
  }

你能告诉我这是不是正确吗?

我试着做了一些改动,保持你的代码不变

struct node{
int num;
struct node next;
}node;

List(L){
    if (L==NULL) return NULL;
    node *p=NULL, *q=L, *l=L, *newhead=NULL;
    while (q!=NULL){
        if (q-> num % 2==1){
              if (p==NULL){
                  p=(node *)malloc(sizeof(node));
                  p->num=q->num;
                  p->next=NULL;
                  newhead=p;
              }
              else {
                 node * tmp;
                 tmp=(node *)malloc(sizeof(node));
                 tmp->num=q->num;
                 tmp->next=NULL;
                 p->next=tmp;
                 p=tmp;

             }
      }
    q=q->next;
  }
  while (l!=NULL){
        if (l-> num % 2==0){
               if (p==NULL){
                  p=(node *)malloc(sizeof(node));
                  p->num=q->num;
                  p->next=NULL;
                  newhead=p;
               }
               else {
                  node * tmp;
                  tmp=(node *)malloc(sizeof(node));
                  tmp->num=q->num;
                  tmp->next=NULL;
                  p->next=tmp;
                  p=tmp;

            }
       }
       l=l->next;
 }

 return newhead;
 }

如果我没有弄错的话,代码是c/c++的,但是在分配num值之前,您没有使用分配给指针的内存?@sasha它只是一个伪代码,但它类似于c。。。我编辑了我的帖子。。。我还需要修改其他东西吗?我看到的第一个错误是,第一个while循环永远运行。你还没有完成q=q->nextI试图编写一个完整的代码,这样就不会有任何混淆,希望它能有所帮助:)另外,为了将来的参考,请发布一个完整的代码,其中包含解释变量名和注释,以解释你在做什么,可以吗解释为什么newhead在函数末尾返回整个新列表@萨沙