Odwracanie listy

0

Jak można odwrócić podwójnie łącząne listę w czasie O(1) ? W czasie O(n) wiem jak zrobić ale w O(1) nic mi do głowy nie przychodzi. Ma ktoś jakiś pomysł?

0

Zamienic glowe z ogonem? oraz traktowac nastepniki jako poprzedniki i vice versa...

0

traktować następnik jako poprzednik hmm... rozumiem, że musiałbym wtedy dać jakiegoś ifa, który by sprawdzał w którą stronę aktualnie mam się przemieszczać?

0

Cos w tym stylu, tak jak piszesz. Ustawiasz flage, ze jest jest na odwrot i wszelkie wywolania do next sa do prev i vice versa. Albo zrobic tablice, np. next_prev_tab[0]=next, next_prev_tab[1]=prev i manipulowac indeksem, czyli np.

exchange_head_with_tail();
REVERSE_FLAG = !REVERSE_FLAG;
if(REVERSE_FLAG)
{
  next_index = 1;
  prev_index = 0;
}
else
{
  next_index = 0;
  prev_index = 1;
}

I w operacjach uzywac zamiast

head->next...

tego

head->next_prev_tab[next_index];

I dzieki temu nie marnujesz taktow na ify za kazdym razem, tylko przy zmianie kolejnosci kolejki. Zlozonozc zamiany jak widac O(1), do korzystanie z kolejki nie zwalnia, bo dochodzi tylko odwolanie do elementu tablicy, czyli tez O(1).

0

Niezłe... Dzięki Johny :-)

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