Как отсортировать двусвязный список SplDoublyLinkedList?

121
24 января 2021, 08:30

Есть двусвязный список который мне нужно отсортировать за O(n Log n) время. Я бы хотел использовать merge sort, но я никак не могу сообразить, как это реализовать путём расширения класса SplDoublyLinkedList из стандартной библиотеки PHP.

Основная проблема в том, что я не могу разделить SplDoublyLinkedList пополам без выделения дополнительной памяти. Если бы я имел объекты отдельных нод, я бы легко мог установить указатель next ноды из середины списка на null, и сохранить указатель на следующую ноду в отдельную переменную, таким образом получив уже два связных списка. Но SplDoublyLinkedList не позволяет провернуть такую операцию.

Я имею ввиду нечто подобное в Java:

node mergeSort(node h) 
    { 
        if (h == null || h.next == null) { 
            return h; 
        } 
        node middle = getMiddle(h); 
        node nextOfMiddle = middle.next; 
        middle.next = null; 
        node left = mergeSort(h); 
        node right = mergeSort(nextofmiddle); 
        node sortedlist = sortedMerge(left, right); 
        return sortedlist; 
    } 

Должен ли я действительно использовать SplDoublyLinkedList в этом случае, или мне лучше написать свою собственую реализацию связного списка?

READ ALSO
Call to a member function find() on boolean

Call to a member function find() on boolean

Использую библиотеку simple_html_domСчитываю csv файл

104
Уведомления с сайта в telegramm

Уведомления с сайта в telegramm

Использую onesignal для уведомлений через сайт

145
Отношения Laravel роли и пользователи

Отношения Laravel роли и пользователи

есть таблица ролей - roles

153
Не запускается сервер (Openserver)

Не запускается сервер (Openserver)

При установленном Apache 22 и PHP 5

127