Удаление среднего узла динамического связанного списка, ЕСЛИ он существует - PullRequest
0 голосов
/ 17 февраля 2019

Для задач программирования мне нужно написать метод, который удалит средний узел связанного списка, только если список содержит нечетное количество узлов.Он должен вернуть информацию в среднем узле, если он существует;и ноль в противном случае.

Например, если список a-> b-> c-> d-> e, c удаляется.И если список a-> b-> c-> d, ничего не удаляется.Задача запрещает использование переменной counter или логического значения.

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

public class DynamicNode {

  // the data in the node
  private Object info;

  // refers to the next node on the list
  private DynamicNode next;

  /**
   * Each time an object of type DynamicNode is instantiated, the constructor places the object
   * being stored in the node into the info field and "points" the next field to the next node in
   * the list.
   */
  public DynamicNode(Object x, DynamicNode n) {
    info = x;
    next = n;

  }

  /**
   * Extracts the object stored in the node.
   */
  public Object getInfo() {
    return info;
  }

  /**
   * "Points" to the node following the current node.
   */
  public DynamicNode getNext() {
    return next;
  }

  /**
   * Inserts the object into the node.
   */
  public void setInfo(Object x) {
    info = x;
  }

  /**
   * Sets the next field to the next node in the list.
   */
  public void setNext(DynamicNode n) {
    next = n;
  }

  public String toString() {
    return info.toString();
  }
}

class DynamicList {


  /**
   * Head of the list.
   */
  private DynamicNode head;

    /**
   * Instantiates a new list and initializes its head pointer to null.
   */
  public DynamicList() {
    head = null;
  }

  public DynamicList(DynamicNode head) {
    this.head = head;
  }

/**
   * Gets the head of the list.
   */
  public DynamicNode getList() {
    return head;
  }

// The problem!
public Object deleteMid() {

}


} 

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Два указателя, которые начинаются с головы.

Переместить один указатель вверх на один, другой на два вверх в списке.

Если указатель, который перемещается вверх дважды, НИКОГДА не равен NULL, значит, у вас нет нечетного связанного списка.

Если указатель, который перемещается вверх дважды, имеет свое поле next NULL, то более медленный движущийся указатель будет в среднем узле.

Попробуйте отследить это на листе бумаги со списками различной длины.Вы увидите, как это работает.

0 голосов
/ 17 февраля 2019

Используйте два указателя.Прогресс одного из них один узел каждый раз, а другой дважды.Если вы обнаружите, пытаясь продвинуться по более быстрому указателю, что вы не можете двинуться вперед дважды, это означает, что список содержит нечетное количество узлов.Вернуть более медленные данные указателей.В противном случае верните ноль.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...