Я пытаюсь реализовать функцию сортировки в этом коде, которая создает двусвязный список.Java: добавление функции сортировки в самонесущий двусвязный список
Я не знаю, с чего начать, кроме добавления «реализует сравнимые». После этого я просто в недоумении, что делать дальше.
public class MyLinkedList<AnyType> implements Comparable<AnyType>, Iterable<AnyType>
{
private int theSize;
private Node<AnyType> beginMarker;
private Node<AnyType> endMarker;
public MyLinkedList()
{
clear();
}
private static class Node<AnyType>
{
public Node(AnyType d, Node<AnyType> p, Node<AnyType> n)
{
data = d; prev = p; next = n;
}
public AnyType data;
public Node<AnyType> prev;
public Node<AnyType> next;
}
public void clear()
{
beginMarker = new Node<AnyType>(null, null, null);
endMarker = new Node<AnyType>(null, beginMarker, null);
beginMarker.next = endMarker;
theSize = 0;
}
public int size()
{
return theSize;
}
public boolean isEmpty()
{
return size() == 0;
}
public boolean add(AnyType x)
{
add(size(), x);
return true;
}
public void add(int idx, AnyType x)
{
addBefore(getNode(idx, 0, size()), x);
}
private void addBefore(Node<AnyType> p, AnyType x)
{
Node<AnyType> newNode = new Node<AnyType>(x, p.prev, p);
newNode.prev.next = newNode;
p.prev = newNode;
theSize++;
}
public AnyType get(int idx)
{
return getNode(idx).data;
}
public AnyType set(int idx, AnyType newVal)
{
Node<AnyType> p = getNode(idx);
AnyType oldVal = p.data;
p.data = newVal;
return oldVal;
}
private Node<AnyType> getNode(int idx)
{
return getNode(idx, 0, size() - 1);
}
private Node<AnyType> getNode(int idx, int lower, int upper)
{
Node<AnyType> p;
if(idx < lower || idx > upper)
throw new IndexOutOfBoundsException("getNode index: " + idx + "; size: " + size());
if(idx < size()/2)
{
p = beginMarker.next;
for(int i = 0; i < idx; i++)
p = p.next;
}
else
{
p = endMarker;
for(int i = size(); i > idx; i--)
p = p.prev;
}
return p;
}
public AnyType remove(int idx)
{
return remove(getNode(idx));
}
private AnyType remove(Node<AnyType> p)
{
p.next.prev = p.prev;
p.prev.next = p.next;
theSize--;
return p.data;
}
public String toString()
{
StringBuilder sb = new StringBuilder("[ ");
for(AnyType x : this)
sb.append(x + " ");
sb.append("]");
return new String(sb);
}
public java.util.Iterator<AnyType> iterator()
{
return new LinkedListIterator();
}
private class LinkedListIterator implements java.util.Iterator<AnyType>
{
private Node<AnyType> current = beginMarker.next;
private boolean okToRemove = false;
public boolean hasNext()
{
return current != endMarker;
}
public AnyType next()
{
if(!hasNext())
throw new java.util.NoSuchElementException();
AnyType nextItem = current.data;
current = current.next;
okToRemove = true;
return nextItem;
}
public void remove()
{
if(!okToRemove)
throw new IllegalStateException();
MyLinkedList.this.remove(current.prev);
okToRemove = false;
}
}
public int compareTo(AnyType other)
{
return this.compareTo(other);
}
related: http://stackoverflow.com/questions/2938495/sorting-a-doubly-linked-list-with-merge-sort?rq=1 –
Что вы пытались, а что вас смущает? –
В встроенных библиотеках Java копирует элементы в массив, сортирует их и копирует их обратно. Это быстрее, чем пытаться отсортировать элементы в списке. –