czy i jak zrobić skok do konkretnego elementu listy w celu poprania danych.
Nijak inaczej - musisz przejść przez pewną ilość węzłów, bo innego wyjścia nie ma; Co prawda można to zoptymalizować, jednak i tak jakoś super szybko nie będzie, bo niestety, ale tak wygląda praca na listach;
Możesz trzymać wskaźniki na pierwszy i ostatni element listy; Przy wyszukiwaniu danego węzła, albo iterować po nich od pierwszego, albo w tył od ostatniego - to zależy w której połowie listy znajduje się szukany węzeł; Czyli jeśli w początkowej połowie to szukać od pierwszego, a jeśli w tej drugiej - od ostatniego;
Jest też taka opcja, żeby trzymać wskaźnik na aktualny węzeł i jego indeks; Co więcej, wyszukiwanie zawsze wykonywać od tego aktualnego, w zadanym kierunku (zależnym od indeksu szukanego węzła); Inicjujesz indeks na 0
oraz wskaźnik na pierwszy węzeł listy; Teraz jeśli indeks szukanego węzła jest większy od indeksu bieżącego - iterujesz po węzłach poprzez pole Next
, gdzie w pętli wykonujesz tyle iteracji, ile jest różnycy pomiędzy tymi indeksami; Jeśli indeks szukanego węzła jest mniejszy - analogicznie używasz Prev
i obliczasz ile iteracji pętli potrzebujesz;
Ten drugi sposób może być przydatny w pewnych warunkach, np. odczytywanie danych z kolejnych węzłów (w dowolnym kierunku); Dzięki temu zawsze wystarczy jedno przejście do Next
lub Prev
, bez konieczności wertowania całej listy; Tym bardziej, jeśli lista jest bardzo długa - zawsze będziesz miał stałą złożoność;
Jakkolwiek byś tego nie zrobił, i tak nie będziesz miał możliwości dostania się do danego węzła w tak prosty i szybki sposób, jak to ma miejsce w przypadku zwykłych macierzy i korzystaniu z indeksu bezpośrednio;
- i może potem skok do Index*Size.. tylko jak? (dla klasy i rekordu)
Znowu - nijak :]
Listy dają taką zaletę, że nie potrzebują alokacji ciągłego bloku pamięci; Dzięki temu wstawianie nowego węzła czy usuwanie istniejącego trwa bardzo krótko, bo nie trzeba przenosić danych po usuwanym elemencie i skracać bloku pamięci; A że nie potrzbują ciągłego bloku - kolejne ich węzły nie muszą istnieć w pamięci zaraz koło siebie;
Co prawda może się tak zdażyć, że akurat bloki pamięci wszystkich węzłów będą koło siebie, ale nic tego nie gwarantuje; Dlatego też żadna arytmetyka nie pomoże - po prostu trzeba iterować po węzłach; Jednak samo iterowanie można różnymi sposobami skrócić - o tym napisałem wcześniej;
PS: O drugim sposobie z zapamiętywaniem aktualnego węzła nigdy nic nie czytałem - po prostu kiedyś wpadłem na taki pomysł; Jednak szczegółowych badań na ten temat nie przeprowadziłem, więc trzeba by wykonać testy.