Перемещение элементов в связанном списке C # .NET

2

Я пытаюсь переместить элементы в моем списке, но когда я сравниваю последний вариант, я выхожу, прежде чем переместить элементы в свой список, связанный с перемещением. Есть ли способ сделать это до того, как node будет вставлен в конец и не сможет выполнить цикл для перемещения элементов?

LinkedList<BD> list = new LinkedList<BD>(b[arg].Values);   
LinkedListNode<BD> node, terminator, next = null;
List<LinkedListNode<BD>> move = new List<LinkedListNode<BD>>();

terminator = list.First;
node = next = list.Last;

while (next != null && next != terminator)
{
    node = next;
    next = next.Previous;
    if (IDs.Contains(node.Value.Id))
    {
        move.Add(node);
        list.Remove(node);
    }
    else
    {
        foreach (var item in move)
        {
            list.AddBefore(node, item);
            node = node.Previous;
        }
        move.Clear();
    }
}
  • 1
    Пожалуйста, отредактируйте свой вопрос, выберите часть кода и нажмите маленькую кнопку «Код» над редактором. Это делает код намного проще для чтения.
  • 0
    @Zyphrax: сделал это для них.
Показать ещё 2 комментария
Теги:
linked-list

3 ответа

1
Лучший ответ

Вот что сработало для меня. Я пробовал разные вещи и думаю о помощи, но вот что для меня работало больше, чем просто перемещение на передний план, а также просто перемещение по списку:

while (next != null)
{
   node = next;
   next = next.Previous;

   if (IDs.Contains(Id))
   {
      move.Add(node);
      list.Remove(node);
   }
   else
   {
      foreach (var item in move)
      {
         list.AddBefore(node, item);
         node = node.Previous;
      }
      move.Clear(); 
   }

   if (next == null) 
   {
      foreach (var item in move)
      {
         list.AddFirst(item);
      }
      move.Clear();
   }
}
0

Что-то вроде этого? (Я пытался использовать его на вашем коде):

LinkedList<BD> list = new LinkedList<BD>(b[arg].Values);
LinkedListNode<BD> node = list.Last;
LinkedListNode<BD> terminator = null;

while (node != null && node != terminator) {
    if (IDs.Contains(node.Value.DocumentVersionId)) {
        LinkedListNode<BD> tempNode = node;
        node = node.Previous;

        list.Remove(tempNode);
        list.AddFirst(tempNode);
        if (terminator == null) terminator = tempNode;
    } else {
        node = node.Previous;
    }
}

Этот фрагмент кода должен переместить ваши узлы, связанные с DocumentVersionId, в начало связанного списка.

Ниже приведен пример с простыми целыми числами, чтобы продемонстрировать, как это работает:

List<int> specials = new List<int> { 1, 4, 5, 7 };
List<int> source = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8 };
LinkedList<int> list = new LinkedList<int>(source);

LinkedListNode<int> node = list.Last;
LinkedListNode<int> terminator = null;

while (node != null && node != terminator) {
    if (specials.Contains(node.Value)) {
        LinkedListNode<int> tempNode = node;
        node = node.Previous;

        list.Remove(tempNode);
        list.AddFirst(tempNode);
        if (terminator == null) terminator = tempNode;
    } else {
        node = node.Previous;
    }
}

Связанный с результатом список будет содержать:
1, 4, 5, 7 (специальные предложения в начале связанного списка), 2, 3, 6, 8

Бесконечный цикл должен быть невозможным.

Ответные изменения:
- node= list.Первый node= list.Last
- добавлен пример с целыми числами

  • 0
    хорошо, предметы перемещены вверх по списку. просто если я переезжаю к первому, возникла проблема. Я попробую твой код. Спасибо
  • 0
    Нету получил бесконечный цикл с этим кодом.
Показать ещё 2 комментария
0

Ваш код чередует два списка - это не выглядит правильным для меня.
Я думаю, что вместо повторного блока

foreach (var item in move)
{
    list.AddBefore(node, item);
    node = node.Previous;
}
move.Clear();

вы, вероятно, хотите что-то вроде

    var before = node.Previous;
    var LinkedListNode<BD> current = null;
    foreach (var item in move)
    {
        list.AddBefore(node, item);
        current = node = item;
    }
    current.Previous = before; // assumes move was not empty
    move.Clear();

чтобы отслеживать, где вы вставляете.

  • 0
    извините за то, что я удалил первый foreach хода, но он был добавлен обратно. Я пытался позвонить, если он собирался завершить цикл и переместить элементы. Я попробую и посмотрю, сработает ли это. Спасибо
  • 0
    Ну, это не работает только потому, что он не попадает в ту часть с текущим кодом и не вызывается. проблема в том, что next равно null, потому что оно находится в начале списка. так что даже если я вызову узел foreach, с .previous не будет дальше
Показать ещё 1 комментарий

Ещё вопросы

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