Я думаю, что "jw013" правильно, но идея нуждается в некоторых улучшениях:
путем замены вы меняете адрес элементов в массиве Arr.поэтому вы должны быть осторожны с этим!
например, скажем, у нас есть Arr как:
индексы: 0 1 2 3 4
| 2 | empty | 3 | empty | 1 | (assume the link list is like 1 -> 2 -> 3)
так что Arr[4].next
0 и Arr[0].next
- это 2.
, но когда вы поменяете местами Arr[4]
и Arr[0]
, тогда Arr[0].next
будет 0.это не то, чего мы хотим добиться, поэтому мы должны рассмотреть возможность корректировки указателей при замене.
, поэтому код для него будет выглядеть так:
public static void compactify(int List_head , int Free , node [] array){
int List_lenght ;
List_lenght = find_listlenght(List_head , array);
if(List_lenght != 0){ // if the list is not empty
int a = List_head;
for (int i = 0; i < List_lenght ; i++) {
swap( array , a , i );
a = array[i].next;
print_mem(array);
}
}
}
теперь при вызове swap:
private static void swap(node[] array, int a, int i) {
// adjust the next and prev of both array[a] and array[i]
int next_a = array[a].next;
int next_i = array[i].next;
int prev_a = array[a].prev;
int prev_i = array[i].prev;
// if array[a] has a next adjust the array[next_a].prev to i
if(next_a != -1)
array[next_a].prev = i;
// if array[i] has a next adjust the array[next_i].prev to a
if(next_i != -1)
array[next_i].prev = a;
// like before adjust the pointers of array[prev_a] and array[prev_i]
if(prev_a != -1)
array[prev_a].next = i;
if(prev_i != -1)
array[prev_i].next = a;
node temp = array[a];
array[a] = array[i];
array[i] = temp;
}