Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java将单链表转换为双链表_Java_List_Linked List - Fatal编程技术网

使用java将单链表转换为双链表

使用java将单链表转换为双链表,java,list,linked-list,Java,List,Linked List,我理解LinkedList和单/双链表的概念。一、 但是我不明白如何在我的代码中实现它 我必须将此单列列表转换为双链接列表: public class MyLinkedList<E> extends MyAbstractList<E> { private Node<E> head, tail; /** Create a default list */ public MyLinkedList() { } /** Create a list

我理解LinkedList和单/双链表的概念。一、 但是我不明白如何在我的代码中实现它

我必须将此单列列表转换为双链接列表:

public class MyLinkedList<E> extends MyAbstractList<E> {
  private Node<E> head, tail;

  /** Create a default list */
  public MyLinkedList() {
  }

  /** Create a list from an array of objects */
  public MyLinkedList(E[] objects) {
    super(objects);
  }

  /** Return the head element in the list */
  public E getFirst() {
    if (size == 0) {
      return null;
    }
    else {
      return head.element;
    }
  }

  /** Return the last element in the list */
  public E getLast() {
    if (size == 0) {
      return null;
    }
    else {
      return tail.element;
    }
  }

  /** Add an element to the beginning of the list */
  public void addFirst(E e) {
    Node<E> newNode = new Node<E>(e); // Create a new node
    newNode.next = head; // link the new node with the head
    head = newNode; // head points to the new node
    size++; // Increase list size

    if (tail == null) // the new node is the only node in list
      tail = head;
  }

  /** Add an element to the end of the list */
  public void addLast(E e) {
    Node<E> newNode = new Node<E>(e); // Create a new for element e

    if (tail == null) {
      head = tail = newNode; // The new node is the only node in list
    }
    else {
      tail.next = newNode; // Link the new with the last node
      tail = tail.next; // tail now points to the last node
    }

    size++; // Increase size
  }


  @Override /** Add a new element at the specified index 
   * in this list. The index of the head element is 0 */
  public void add(int index, E e) {
    if (index == 0) {
      addFirst(e);
    }
    else if (index >= size) {
      addLast(e);
    }
    else {
      Node<E> current = head;
      for (int i = 1; i < index; i++) {
        current = current.next;
      }
      Node<E> temp = current.next;
      current.next = new Node<E>(e);
      (current.next).next = temp;
      size++;
    }
  }

  /** Remove the head node and
   *  return the object that is contained in the removed node. */
  public E removeFirst() {
    if (size == 0) {
      return null;
    }
    else {
      Node<E> temp = head;
      head = head.next;
      size--;
      if (head == null) {
        tail = null;
      }
      return temp.element;
    }
  }

  /** Remove the last node and
   * return the object that is contained in the removed node. */
  public E removeLast() {
    if (size == 0) {
      return null;
    }
    else if (size == 1) {
      Node<E> temp = head;
      head = tail = null;
      size = 0;
      return temp.element;
    }
    else {
      Node<E> current = head;

      for (int i = 0; i < size - 2; i++) {
        current = current.next;
      }

      Node<E> temp = tail;
      tail = current;
      tail.next = null;
      size--;
      return temp.element;
    }
  }

  @Override /** Remove the element at the specified position in this 
   *  list. Return the element that was removed from the list. */
  public E remove(int index) {   
    if (index < 0 || index >= size) {
      return null;
    }
    else if (index == 0) {
      return removeFirst();
    }
    else if (index == size - 1) {
      return removeLast();
    }
    else {
      Node<E> previous = head;

      for (int i = 1; i < index; i++) {
        previous = previous.next;
      }

      Node<E> current = previous.next;
      previous.next = current.next;
      size--;
      return current.element;
    }
  }

  @Override /** Override toString() to return elements in the list */
  public String toString() {
    StringBuilder result = new StringBuilder("[");

    Node<E> current = head;
    for (int i = 0; i < size; i++) {
      result.append(current.element);
      current = current.next;
      if (current != null) {
        result.append(", "); // Separate two elements with a comma
      }
      else {
        result.append("]"); // Insert the closing ] in the string
      }
    }

    return result.toString();
  }

  @Override /** Clear the list */
  public void clear() {
    size = 0;
    head = tail = null;
  }

  @Override /** Return true if this list contains the element e */
  public boolean contains(E e) {
    System.out.println("Implementation left as an exercise");
    return true;
  }

  @Override /** Return the element at the specified index */
  public E get(int index) {
    System.out.println("Implementation left as an exercise");
    return null;
  }

  @Override /** Return the index of the head matching element in 
   *  this list. Return -1 if no match. */
  public int indexOf(E e) {
    System.out.println("Implementation left as an exercise");
    return 0;
  }

  @Override /** Return the index of the last matching element in 
   *  this list. Return -1 if no match. */
  public int lastIndexOf(E e) {
    System.out.println("Implementation left as an exercise");
    return 0;
  }

  @Override /** Replace the element at the specified position 
   *  in this list with the specified element. */
  public E set(int index, E e) {
    System.out.println("Implementation left as an exercise");
    return null;
  }

  @Override /** Override iterator() defined in Iterable */
  public java.util.Iterator<E> iterator() {
    return new LinkedListIterator();
  }

  private void checkIndex(int index) {
    if (index < 0 || index >= size)
      throw new IndexOutOfBoundsException
        ("Index: " + index + ", Size: " + size);
  }

  private class LinkedListIterator 
      implements java.util.Iterator<E> {
    private Node<E> current = head; // Current index 

    @Override
    public boolean hasNext() {
      return (current != null);
    }

    @Override
    public E next() {
      E e = current.element;
      current = current.next;
      return e;
    }

    @Override
    public void remove() {
      System.out.println("Implementation left as an exercise");
    }
  }

  private static class Node<E> {
    E element;
    Node<E> next;

    public Node(E element) {
      this.element = element;
    }
  }
}
公共类MyLinkedList扩展了MyAbstractList{
私有节点头、尾;
/**创建默认列表*/
公共MyLinkedList(){
}
/**从对象数组创建列表*/
公共MyLinkedList(E[]对象){
超级(对象);
}
/**返回列表中的head元素*/
公共E getFirst(){
如果(大小==0){
返回null;
}
否则{
返回头元素;
}
}
/**返回列表中的最后一个元素*/
公共E getLast(){
如果(大小==0){
返回null;
}
否则{
返回尾元素;
}
}
/**将元素添加到列表的开头*/
公共无效地址优先(E){
Node newNode=新节点(e);//创建一个新节点
newNode.next=head;//将新节点链接到head
head=newNode;//head指向新节点
size++;//增加列表大小
if(tail==null)//新节点是列表中唯一的节点
尾=头;
}
/**将元素添加到列表的末尾*/
公共无效地址(E){
Node newNode=新节点(e);//为元素e创建一个新节点
if(tail==null){
head=tail=newNode;//新节点是列表中唯一的节点
}
否则{
tail.next=newNode;//将新节点与最后一个节点链接
tail=tail.next;//tail现在指向最后一个节点
}
size++;//增加大小
}
@Override/**在指定索引处添加新元素
*在此列表中。head元素的索引为0*/
公共无效添加(整数索引,E){
如果(索引==0){
第一(e);
}
否则如果(索引>=大小){
addLast(e);
}
否则{
节点电流=头;
对于(int i=1;i=大小){
返回null;
}
else if(索引==0){
return removeFirst();
}
else if(索引==大小-1){
返回removeLast();
}
否则{
节点前一个=头;
对于(int i=1;i=大小)
抛出新的IndexOutOfBoundsException
(“索引:+Index+”,大小:+Size);
}
私有类链接标识符
实现java.util.Iterator{
私有节点当前=头;//当前索引
@凌驾
公共布尔hasNext(){
返回(当前!=null);
}
@凌驾
公共教育{
E=当前元素;
当前=当前。下一步;
返回e;
}
@凌驾
公共空间删除(){
System.out.println(“作为练习的实现”);
}
}
专用静态cla
  private static class Node<E> {
    E element;
    Node<E> next;
    Node<E> previous;


    public Node(E element) {
      this.element = element;
    }