Перестановка элементов двусвязного списка - PullRequest
3 голосов
/ 27 октября 2011

Я реализую выбор сортировки, и мне нужно поменять местами элементы.У меня есть двусвязный список с предыдущими и последующими ссылками.И ссылка на первый и последний элемент в списке мне всегда нужно поменять местами какой-то узел b с первым узлом toStartFrom

public void Swap(Node toStartFrom, Node b) {
        Boolean NextToEachOther = (toStartFrom.next == b);
        toStartFrom.next = b.next;
        b.previous = toStartFrom.previous;
        if (NextToEachOther) {
            toStartFrom.previous = b;
            b.next = toStartFrom;
        } else {
            toStartFrom.previous = b.previous;
            b.next = toStartFrom.next;
        }
    }

    public void display() {
        Node current = first;
        while (current != null) {
            ...printing...
            current = current.next;
        }
    }

Но это не работает.Никаких ошибок просто не сортируется в правильном порядке.И не отображать элементы после сортировки после узла toStartFrom.

1 Ответ

2 голосов
/ 27 октября 2011

Вам также необходимо обновить узлы, которые находятся рядом с заменяемыми 2

Например, рассмотрите этот список:

first -> a -> b -> c

Если вы хотите поменять местами сначала и b, то вы также должны обновить ссылки a и c на следующую и предыдущую ссылки.

Редактировать: этот код должен быть помещен перед вашим кодом, который выполняет своп, и сразу после логического объявления

Edit2: Кроме того, если у вас есть ссылки на начало / конец списка, вам также необходимо обновить их.Я не вижу, чтобы вы указывали на голову или хвост где-либо в вашем коде.

if(toStartFrom.prev != null)
{
   toStartFrom.prev.next = b;
}
if(toStartFrom.next != b) // Equivalent to NextToEachOther
{
   toStartFrom.next.prev = b;
}
if(b.next != null)
{
   b.next.prev = toStartFrom;
}
if(b.prev != toStartFrom)  // Equivalent to NextToEachOther
{
   b.prev.next = toStartFrom
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...