Odwrócenie listy dwukierunkowej

0

Witam mam zadanie odwrócić liste dwukierunkowa i wpadlem na taki pomysl:
Mam wskaznik na ostatni element, wiec przechodze cala liste i swapuje wskazniki poprzedni i kolejny i przechodze do kolejnego elementu listy.
Ale nie wiem gdzie jest blad.

Zmienna tmp jest do swapowania wskaznikow, a tmp2 jest po to, zeby zapamietać kolejny wezel po swapnieciu.

void odwrot(lista*& glowa, lista* ostatni)
{
	if (glowa == nullptr)return;
	else
	{
		lista* iterator = glowa;
		lista* tmp = glowa;
		lista* tmp2 = glowa;
		while (iterator != ostatni)
		{
			tmp2 = iterator->pkolejny;
			tmp = iterator->ppoprzedni;
			iterator->ppoprzedni = iterator->pkolejny;
			iterator->pkolejny = tmp;
			iterator = tmp2;

		
		}
		glowa = iterator;
	}
}
2

Na pewno masz błąd w nazewnictwie zmiennych (celowo zaciemniasz kod nazywając je tmp i tmp2 zamiast czegoś czytelnego?) i definiowaniu ich w odpowiednim zakresie.

Ponadto nie odwracasz ostatniego elementu (pętla zakończy się gdy dojdziesz do ostatniego, nie wykonując się dla niego. Powinieneś mieć coś w stylu:

lista* it = glowa;
while(it) {
    lista* next = it->next;
    lista* prev = it->prev;
    it->next = prev;
    it->prev = next;
    it = next;
}

Albo, skoro to C++:

for(lista* it = glowa; it; it = it->prev)
    std::swap(it->next, it->prev);
1
struct BiNode { BiNode *next,*prev; double value; };
struct BiList { BiNode *head,*tail; };

void reverse(BiList &lst)
{
    for(BiNode *h=lst.head,*t=lst.tail;(h!=t)&&(h!=t->prev)&&(h->next!=t);h=h->next,t=t->prev) swap(h->value,t->value);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1