Programim dhe zhvillim, javascript, python, php, html

Kthimi i një liste të lidhur në mënyrë rekursive në c

Kodi i mëposhtëm funksionon mirë kur koka i dërgohet atij si parametër. Meqë jam i ri në C, nuk mund ta kuptoja se si funksionon. Më ndihmo të lutem.

struct node *recursiveReverseLL(struct node *list)
{
    struct node *revHead;
    if (list == NULL || list->link == NULL)
    {
        return list;
    }

    revHead = recursiveReverseLL(list->link);
    list->link->link = list;
    list->link = NULL; 

    return revHead;
}

Nuk e di se si sigurohen lidhjet duke përdorur ato thirrje rekursive. dmth) nëse lidhjet janë si,

1 -> 2 -> 3 -> 4 

atëherë si është ndryshuar si,

4 -> 3 -> 2 -> 1

  • pls përcaktoni më saktë atë që nuk është e qartë për ju 29.12.2012
  • Nuk e di se si sigurohen lidhjet duke përdorur ato thirrje rekursive 29.12.2012
  • Mendoni për zgjidhjen në terma të përgjithshëm dhe më themelorë. Më e vogla do të ishte një listë me 2 nyje 1->2->null. Për ta bërë atë gjenerike, ne gjithmonë do t'i referohemi nyjeve të tjera nga nyja first. Për ta kthyer këtë, vendosni first(1)->next(2)->next(null) = first(1) duke e bërë atë 1<->2 dhe më pas first(1)->next(2) = null do të rezultojë në null<-1<-2. Përdoreni këtë rregull në mënyrë rekursive. 14.09.2019

Përgjigjet:


1

Algoritmi i përgjithshëm rekurziv për këtë është:

  1. Divide lista në 2 pjesë - nyja e parë dhe pjesa tjetër e listës.
  2. Thirrni në mënyrë rekursive reverse për rest të listës së lidhur.
  3. Lidhni rest me first.
  4. Rregulloni treguesin head

Këtu është kodi me komente inline:

struct node* recursiveReverseLL(struct node* first){

   if(first == NULL) return NULL; // list does not exist.

   if(first->link == NULL) return first; // list with only one node.

   struct node* rest = recursiveReverseLL(first->link); // recursive call on rest.

   first->link->link = first; // make first; link to the last node in the reversed rest.

   first->link = NULL; // since first is the new last, make its link NULL.

   return rest; // rest now points to the head of the reversed list.
}

Shpresoj që kjo foto t'i bëjë gjërat më të qarta:

image
(burimi: geeksforgeeks.org)
.

29.12.2012
  • M'u desh pak kohë që ta kuptoja. Por megjithatë, është një zgjidhje shumë e mirë. 15.04.2014
  • Në thelb ju shkoni në nyjen e fundit dhe vazhdoni të ktheni një tregues në të, në të njëjtën kohë kaloni lidhjet midis nyjeve. A e kuptova mirë? 19.04.2014
  • kjo është pa nevojë rekursive dhe mund të jetë plotësisht përsëritëse - më shumë efikas dhe gjithashtu shumë më i qartë. 20.07.2018

  • 2

    Zgjidhja alternative:

    struct node *head;
    void reverse(struct node *prev, struct node *cur)
    {
       if(cur){
          reverse(cur,cur->link);
          cur->link = prev;
        }
        else{
          head = prev;
        }
    }
    

    Kryesisht, thirrni reverse (NULL, kokë);

    08.01.2016
  • Një mënyrë më elegante për ta quajtur me siguri është ta mbështillni atë me një funksion tjetër, i cili thjesht do të merrte kokën. 27.08.2016

  • 3

    Le të jetë lista e lidhur 1-> 2 -> 3 ->4

    funksioni në c është--

    struct linked_node * reverse_recursive(struct linked_node * head)
    {
    struct linked_node * first;/*stores the address of first node of the linked
    list passed to function*/
    struct linked_node * second;/* stores the address of second node of the
    linked list passed to function*/
    struct linked_node * rev_head;/*stores the address of last node of initial 
    linked list. It also becomes the head of the reversed linked list.*/
    //initalizing first and second
    first=head;
    second=head->next;
    //if the linked list is empty then returns null
    if(first=NULL)
       return(NULL);
    /* if the linked list passed to function contains just 1 element, then pass
    address of that element*/
    if(second==NULL)
       return(first);
    /*In the linked list passed to function, make the next of first element 
     NULL. It will eventually (after all the recursive calls ) make the
     next of first element of the initial linked list NULL.*/
    first->next=NULL;
    /* storing the address of the reverse head which will be passed to it by the
     condition if(second==NULL) hence it will store the address of last element
     when this statement is executed for the last time. Also here we assume that 
    the reverse function will yield the reverse of the rest of the linked 
    list.*/
    rev_head=reverse(second);
    /*making the rest of the linked list point to the first element. i.e. 
     reversing the list.*/
    second->next=first;
    
    /*returning the reverse head (address of last element of initial linked 
    list) . This condition executes only if the initial list is 1- not empty 
    2- contains more than one element. So it just relays the value of last 
    element to higher recursive calls.  */
    return(rev_head);
    }
    

    tani ekzekuton funksionin për listën e lidhur 1-> 2-> 3 -> 4

    • brenda reverse(&1) kodi funksionon derisa rev_head=reverse(&2); // këtu &1 është adresa e 1.

    lista e funksionit është
    1(i pari)->2(e dyta) -> 3 -> 4

    • brenda kodit reverse(&2) ekzekutohet derisa rev_head=reverse(&3); lista e funksionit
      2(i pari)->3 (i dyti)-> 4

    • kodi brenda reverse(&3) shkon derisa rev_head=reverse (&4); lista nëse funksioni
      3(i pari)-> 4 (i dyti)

    • brenda kushtit përfundimtar reverse(&4) second==NULL është e vërtetë kështu që kthimi ekzekutohet dhe adresa e 4 kthehet.

    lista e funksionit

    4 (e para) -> NULL (e dyta)

    • kthimi në listën reverse(&3) të funksionit është
      NULL‹-3(first) 4 (e dyta)
      dhe vlera e rev_head=&4 e cila u kthye

    pas ekzekutimit second->next=first; lista bëhet

    NULL‹- 3 (e para) ‹-4 (e dyta)

    kthimi (rev_head); ekzekutohet i cili kalon &4 sepse rev_head=&4

    • kthehu në kthim (&2)

    lista në funksion është

    NULL‹-2(e para) 3(e dyta)‹-4

    dhe rev_head është &4 që u kthye nga rev(&3)

    pas ekzekutimit second->next=first, lista bëhet

    NULL‹-2(e para)‹-3(e dyta)‹-4

    kthimi (rev_head); ekzekutohet i cili kthen &4 në rev(&1);

    • kthehu në kthim (&1)

    lista në funksion është

    NULL‹-1(e para) 2(e dyta)‹-3‹-4

    dhe vlera e rev_head është &4 e cila u kalua me reverse(&3)

    tani second->next =first ekzekutohet dhe lista bëhet

    NULL‹-1(e para) ‹- 2(e dyta)‹-3‹-4

    kthimi (rev_head); ekzekutohet // rev_head=&4 i cili u kthye me reverse(&2) dhe vlera e rev_head i kalohet funksionit kryesor.

    shpresoj se kjo ndihmon. M'u desh mjaft kohë për ta kuptuar këtë dhe gjithashtu për të shkruar këtë përgjigje.

    21.03.2017
  • ju lutemi kontrolloni nomenklaturën e funksioneve përpara se t'i përdorni. reverse nuk është deklaruar. 22.07.2017

  • 4

    Një zgjidhje tjetër:

    struct node *reverse_recur(struct node *temp)
    {
        if(temp->link==NULL)
        {
            return temp;
        }
    
        struct node *temp1=temp->link;
    
        temp->link=NULL;
    
        return (reverse_recur(temp1)->link=temp);
    
    }
    
    19.07.2014

    5

    Kjo është një qasje e bukur që mund të ndiqet për të kthyer SLL në mënyrë rekursive:

    1.    struct node* head; // global head
    2.    void rec_reverse(struct node* prev, struct node* cur)
    3.    {
    4.        if (cur)
    5.        {
    6.            rec_reverse(cur, cur->next);
    7.            cur->next = prev;
    8.        }
    9.        else
    10.            head = prev;
    11.    }
    

    Thirrni funksionin në këtë mënyrë:

    rec_reverse(NULL, head);
    

    Qasja:

    • Duke thirrur funksionin në mënyrë rekursive (rreshti 6) shkojmë në nyjen e fundit të listës së lidhur.
    • Më pas përditësojmë kokën me adresën e nyjës së fundit (rreshti 10).
    • Së fundi, ne drejtojmë lidhjen e secilës nyje me nyjen e saj të mëparshme (rreshti 7).
    30.07.2017
  • e bukura është shumë e diskutueshme. duke shtuar vetëm një variabël temp për të ruajtur vlerën curr-›next, ju mund të ndërroni dy linjat e kodit duke e bërë thirrjen rekursive të jetë në pozicionin bisht, gjë që është shumë më e rëndësishme. dhe kodi bëhet shumë më i qartë dhe më i kuptueshëm: void rec_reverse(struct node* prev, struct node* cur) { if (cur==NULL) { head = prev; } else { next = cur->next; cur->next = prev; rec_reverse(cur, next); } }. 20.07.2018

  • 6

    Më duket se askush nuk ka sugjeruar një algoritëm që është rekurziv i bishtit. Në parim, një algoritëm rekurziv i bishtit mund të kompilohet pa një pirg (me kusht që përpiluesi të jetë mjaftueshëm i zgjuar), duke prodhuar kështu kodin që konsumon më pak memorie.

    Supozoni se TList është një tip i personalizuar i të dhënave për listën me një lidhje të vetme, është një tregues drejt një strukture që si fushë link për të hyrë në elementin tjetër në listë.

    Algoritmi është si më poshtë:

    ```

    TList reverse_aux(TList l, TList solution) {
        if (l == NULL) {
            return solution;
        } else {
            TList tmp = l->link;
            l->link = solution;
            return reverse_aux(tmp, l);
        }
    }
    
    TList reverse(TList l) {
        return reverse_aux(l, NULL);
    }
    

    ```

    23.05.2018

    7
    ll *rev_list(ll *prev, ll *cur)
    {
        if (!cur) {
            return prev;
        }
    
        ll *tmp = cur;
        cur = cur->next;
        tmp->next = prev;
        prev = tmp;
        return rev_list(prev, cur);
    }
    

    Gjeni kodin e plotë: https://github.com/vijaythreadtemp/Data-Structures-And-Algorithms/blob/master/rev_link_list_rec.cxx

    07.05.2020

    8
  • Kjo metodë përdor një hapësirë ​​shtesë të stivës (NextElement) për çdo përsëritje. 07.01.2018
  • Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..