Einfach verkettete Liste umdrehen



  • Guten Abend,

    ich hab da ein Problem. Ich will eine einfach verkettete Liste erstellen und anschließend invertieren, d.h. aus 1 2 3 4 5 will ich 5 4 3 2 1 machen. Das funktioniert auch....fast. Er dreht alle Elemente um, bis auf das ganz vorne, also die 1. Alle Versuche, das richtig zu machen, sind bisher gescheitert. Kann mir vielleicht jemand helfen?

    Danke für jede Antwort. Hier ist mal mein Code.

    #include <iostream>
    using namespace std;
    
    struct ListElement{
    	int zahl;
    	ListElement* next;
    };
    
    void printList(ListElement* l) {  
    	while(l) {
    		cout << l->zahl<< " ";
    		l=l->next;
    	}
    }
    
    void invert(ListElement *head)
    {	
        ListElement *m=NULL,*n,*l=head->next;
    	while(l!=NULL) {
    
            n=m;           
          	m=l;
    		l=l->next; 
    		m->next = n;
    	}
    	head->next=m;
    }           
    
    int main() {
    	/* Knoten werden erzeugt */
    	ListElement* node1= new ListElement;
    	ListElement* node2= new ListElement;
    	ListElement* node3= new ListElement;
    	ListElement* node4= new ListElement;
    	ListElement* node5= new ListElement;
    
    	node1->zahl=1;
    	node2->zahl=2;
    	node3->zahl=3;
    	node4->zahl=4;
    	node5->zahl=5;
    
    	node1->next=node2;
    	node2->next=node3;
    	node3->next=node4;
    	node4->next=node5;
    	node5->next=NULL;
    
    	printList(node1);
    	cout << endl;
    	invert(node1);
    	printList(node1);
    }
    


  • Ich wüde sagen, dass der Fehler hier liegt:

    ListElement *m=NULL,*n,*l=head->next;
    

    Hier initialisierst du ja l mit head->next. Also wird head (dein erstes Element) gar nicht miteinbezogen. Also einfach mal das hier machen:

    ListElement *m=NULL,*n,*l=head;
    

    Das sollte imo in etwa so gehen.

    btw:
    Den Speicher, den du anforderst, musst du wieder freigeben. (zu jedem new gehört in delete). C++ hat keinen Garbage Collector, also musst du das selbst tun.



  • Hmm, ich hab jetzt mal diese Änderung gemacht, aber da gerät das Programm jetzt in eine Endlosschleife. 😮



  • Ok, ich habs jetzt hingebracht. Thread closed 😉


Anmelden zum Antworten