получить указатель на объект, который является постоянным - PullRequest
0 голосов
/ 27 апреля 2011

У меня есть двойной связанный список со многими элементами списка. так что я могу использовать item.next, item.prev и т. д. (например, item.next.prev.prev.next.prev также будет работать) Я хочу поменять местами два элемента, поэтому сначала мне нужно сохранить следующий и предыдущий из элемента A:

Item aprev = a.prev;
Item anext = a.next;

Теперь я хочу поменять b на:

a.next = b.next;
a.prev = b.prev;
a.next.prev = a;
a.prev.next = a;

Теперь мне нужно поменять местами a и b, чтобы я использовал мои предыдущие сохраненные элементы:

b.next = aprev;
b.prev = anext;
...

Теперь у меня проблема! aprev это a.prev, который теперь b.prev! так что предмет зацикливается на своем ...

что я могу сделать, чтобы поменять местами эти элементы ?? Мне нужен какой-то временный элемент, но как, когда указатель на объект исчез, когда я перезаписываю его?

Ответы [ 2 ]

3 голосов
/ 27 апреля 2011
temp = a.prev;
a.next = b.next;
a.prev = b;
b.next = a;
b.prev = temp;

сделает.

2 голосов
/ 27 апреля 2011

Обычно у вас будет две операции подкачки, одна для предыдущих указателей, одна для следующих указателей:

swapPrevPointer(a,b);
swapNextPointer(a,b);

с

private swapPrevPointer(Item a, Item b) {
   Item temp = a.prev;
   a.prev = b.prev;
   b.prev = temp;
}

private swapNextPointer(Item a, Item b) {
   Item temp = a.next;
   a.next = b.next;
   b.next = temp;
}

Визуальныйобъяснение

Начальный список:

null <--ap-- A --an--> B --bn--> C 
               <--bp--  

После обмена:

null <--ap-- B --an--> A --bn--> C 
               <--bp--  

необходимые изменения

B.prev <- ap ____ swapping "prev" pointers
A.prev <- bp _/
B.next <- an ____ swapping "next" pointers
A.next <- bn _/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...