LinkedListNode в Java

1

Я пытаюсь преобразовать код С# в Java. Я почти переделал все, кроме трех строк в if.

код С#

LinkedList<T> buk = new LinkedList();
LinkedListNode<T> current = buk.First;
LinkedListNode<T> previous = null;
if (fooCondition) {
    previous = current.Previous;
} else {
    previous = current;
    current = current.Next;
}

Эквивалентный код Java

LinkedList<T> buk = new LinkedList<>();
T current = buckets.getFirst();
T previous = null;
if (fooCondition) {
    ?                   //previous = current.Previous;  
} else {
    ?                   //previous = current;
    ?                   //current = current.Next;
}

Поскольку в Java нет класса LinkedListNode, может ли кто-нибудь предположить, что будет эквивалентным кодом в Java?

РЕДАКТИРОВАТЬ

Кажется, что полный код очень важен для получения помощи. Вот функция С# из ссылки

  protected void MergeBuckets()
    {
        LinkedListNode<Bucket> current = buckets.First;
        LinkedListNode<Bucket> previous = null;

        int k = (int)Math.Ceiling(1 / epsilon);             // k=1/eps as integer
        int kDiv2Add2 = (int)(Math.Ceiling(0.5 * k) + 2);   // k/2 as integer
        // at this point 1/k <= eps, k >= 2, hence requires eps >= 0.5

        // number of concecutive buckets with same count causing a 
        // merge of the oldest two of those buckets
        int numberOfSameCount = 0;

        // traverse buckets from first to last, hence in order of 
        // descending timestamp and ascending count
        while (current != null)
        {
            // previous and current bucket have same count, increment counter
            if (previous != null && previous.Value.Count == current.Value.Count)
                numberOfSameCount++;
            // current is first with that count, reset counter to 1
            else
                numberOfSameCount = 1;

            // detect need for a merge
            if (numberOfSameCount == kDiv2Add2)
            {
                // merge buckets into current and remove previous
                current.Value.Timestamp = previous.Value.Timestamp;                 // take most recent timestamp
                current.Value.Count = previous.Value.Count + current.Value.Count;   // sum the counts of the buckets, 
                                                                                    // i.e. next power of two

                buckets.Remove(previous);

                // note that a merged bucket might cause a cascade of merges due to its new count,
                // hence the new current node should point to the merged bucket otherwise the 
                // cascade might go unnoticed, temporarily violating the invariant!

                previous = current.Previous;    // merged bucket previous, since old previous is removed
                //current = current;            // trivial, merged bucket is new current

                // at this iteration, the traversal stays in place
            }
            // no merge required, continue normally
            else
            {
                previous = current;         // old current bucket or merged bucket
                current = current.Next;     // current or merged next

                // at this iteration, the traversal moves to the next (older) bucket
            }
        }
    }
  • 5
    Почему вы делаете if / else с 'true' в качестве условия?
  • 0
    Я просто упростил это, есть переменная, которая проверяется, если условие.
Показать ещё 12 комментариев
Теги:

5 ответов

4

не можете ли вы использовать listIterator, предоставленный LinkedList, и использовать предоставленные методы для просмотра связанного списка

ListIterator<T> listIterator = linkedListNode.listIterator(0);
if(yourCondition && listIterator.hasNext()){
    T next = listIterator.next();
}
else if (listIterator.hasPrevious()){
    T previous = listIterator.previous();
}

Надеюсь, поможет

  • 0
    Это может быть лучшим ответом ИМХО, если вы примените это непосредственно к вопросу ОП.
  • 0
    Я согласен, дать ему голос, чтобы привлечь к нему внимание. Однако я хотел бы отметить, что previous () перемещает указатель назад, тогда как previousIndex () просто предоставит ссылку на позицию предыдущего узла в списке.
Показать ещё 2 комментария
1

Класс Java java.util.LinkedList имеет внутренний класс LinkedList.Node который является private. Node в LinkedList нельзя получить напрямую. Вместо этого обратитесь к методам List.indexOf(E) и List.add(E, int) или ListIterator, чтобы вставлять элементы в определенные позиции.

final LinkedList<T> list = new LinkedList<>();
list.add(object1);
if (cond) {
    list.add(object2, list.indexOf(object1));
} else {
    list.addFirst(object2);
}

Часто используемая идиома для работы с LinkedList в Java - это создание LinkedList но в основном работает с ним с помощью ListIterator.

final LinkedList<T> list = new LinkedList<>();
final ListIterator<T> iterator = list.listIterator();
if (!cond && list.hasNext()) {
    list.next();
}
list.add(object2);
0

Вы можете написать собственную версию класса LinkedListNode которая содержит previous и next как свойство property/field. Например -

class LinkedListNode{

 LinkedListNode previous;
 LinkedListNode next; 

}

Затем добавьте метод getter и setter для доступа к свойству/полю. Вы можете добавить другое свойство/поле для хранения значения узла. Это базовая структура. Это может помочь вам. Возможно, вы также посмотрите на эту ссылку.
благодаря

  • 0
    Как LinkedListNode может работать как LinkedList.getFirst () не возвращает объект LinkedListNode
0

Вы не можете создать LinkedList без узлов. К сожалению, ваш код не имеет смысла.

Узел LinkedList (в данном случае двусвязный) состоит из следующего узла, предыдущего и данных в узле, а также методов доступа. Это довольно просто реализовать, поскольку это просто структура хранилища данных.

class LinkedListNode<T> {
    LinkedListNode prevNode, nextNode;
    T data;

    public LinkedListNode getNext() {
        return nextNode;
    }
    public LinkedListNode getPrev() {
        return prevNode;
    }
    public T getValue() {
        return data;
    }
    public void setNext( LinkedListNode n ) {
        nextNode = n;
    }
    public void setPrev( LinkedListNode n ) {
        prevNode = n;
    }
    public void setValue( T data ) {
        data = n;
    }
}
  • 2
    Вам также нужно будет реализовать свой собственный список ссылок, который использует этот LinkedListNode.
  • 2
    На самом деле в Java нормальным способом является создание LinkedList без узлов. Класс LinkedList позаботится о самих узлах внутри себя.
Показать ещё 2 комментария
-2
    LinkedList<T> buk=new LinkedList<T>();
    //make list
    T current=buk.getFirst();
    T previous=null;

    if (fooCondition) {
        previous = current.previous;
    } else {
        previous = current;
        current = current.next;
    }

и структура T:

Class T{
  public T previous;
  public T next;
  //rest
}
  • 0
    В этом коде отсутствует объяснение, и предполагается, что в T есть getPrevious() и getNext() - как они связаны с LinkedList ? Как они должны работать?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню