2012-08-10 44 views
0

I m new ds。我正在嘗試這個問題 - 給定一個鏈表,寫一個函數以有效的方式反轉每個備用k節點(其中k是函數的輸入)。給算法的複雜性。我的代碼給我分段錯誤。幫幫我!反轉每個交替的k個節點

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; 
} 
+0

你檢查覈心轉儲到針點內存故障的位置? – Aftnix 2012-08-10 14:27:49

+0

有利於調試的一件事是使用有意義的變量名稱。 「func」,「list1」和「list2」這兩個名稱並不能很好地描述這些變量的用途。 – 2012-08-10 15:55:17

+0

如果列表節點的數量不是k的倍數,該怎麼辦? – Armali 2014-04-08 12:25:57

回答

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); 
}