0

私は新しい ds です。私はこの質問を試みていました-リンクされたリストが与えられた場合、効率的な方法ですべての代替 k ノード (k は関数への入力) を逆にする関数を作成します。アルゴリズムの複雑さを教えてください。コードでセグメンテーション違反が発生しています。ヘルプ!

</p>

struct node* func(struct node* head, int k)
{
    struct node* run, *list1;
    run =head->next;
    list1=head;

    int count =0;

    struct node *list2=NULL;

while(list1!=NULL && count++<k)
{
    list1->next=list2;
    list2=list1;
    list1=run;
    run=list1->next;
}

head=list2;

while(list2->next!=NULL && list2!=NULL)
    list2=list2->next;

list2->next=list1;

while(list1!=NULL && count++<k-1)
    list1=list1->next;

if(list1!=NULL)
    list1->next=func( head, k);
    return head;
}
4

1 に答える 1

0
struct node* func_aux(struct node* head, struct node* rev, int k){
    struct node* next;
    if(k == 0 || head == NULL)
        return rev;
    next = head->next;
    head->next = rev;
    return func_aux(next, head, --k);
}

struct node* func(struct node* head, int k){
    struct node* kth_node;
    int i=0;
    for(kth_node=head;kth_node;kth_node=kth_node->next,++i){
        if(k==i)break;
    }
    return func_aux(head, kth_node, k);
}
于 2012-08-10T15:41:20.797 に答える