删除动态链表的中间节点(如果存在)

时间:2019-02-17 01:36:13

标签: java linked-list

对于编程方面的挑战,我需要编写一种方法来删除链表的中间节点,前提是该链表的节点数为奇数。如果存在,它将在中间节点中返回信息;否则为null。

例如,如果列表为a-> b-> c-> d-> e,则删除c。如果列表是a-> b-> c-> d,则不会删除任何内容。挑战禁止使用计数器变量或布尔值。

我知道只需使用一个循环即可解决该问题。我知道我应该使用一个临时节点来完成循环,但是我不确定如何进行。我在不使用计数器的情况下检查列表中节点的数量有麻烦,并且想不出如何将指针移到中间的节点。

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 :(得分:2)

两个从头开始的指针。

在列表中将一个指针向上移动一个,将另一个指针向上移动两个。

如果两次向上移动的指针为NULL,则您没有奇数链接列表。

如果向上移动两次的指针的next字段为NULL,则移动较慢的指针将位于中间节点。

尝试在一张纸上进行追踪,并列出不同长度的清单。您会看到它是如何工作的。

答案 1 :(得分:0)

使用两个指针。 其中一个节点每次进展一个,其他节点两次进展。 如果您在尝试加快速度时发现指针,则无法前进两次,这意味着列表中的节点数为奇数。返回较慢的指针数据。否则,返回null。