简体   繁体   中英

Why is this removing all elements from my LinkedList?

Why is my remove method removing every element from my Doubly Linked List? If I take out that if/else statements then I can successfully remove middle elements, but elements at the head or tail of the list still remain. However, I added the if/else statements to take care of elements at the head and tail, unfortunately this method now removes every element in my list. What am I do wrong?

package week6;

import java.util.Iterator;

public class DblLinkedList<E>
{
   private LinkEntry<E> head = null;
   private LinkEntry<E> tail = null;
   private int size = 0;

   public DblLinkedList()
   {
      head = tail = null;
   }

   public boolean is_empty()
   {
      if (head == null) 
          return true;
      return false;
   }

   public int size()
   {
       int count = 0;
       for (LinkEntry<E> current = head; current != null; current = current.next)
           count++;
       return count;
   }

   public boolean add(E e)
   {   
      LinkEntry<E> new_element = new LinkEntry<E>();
      new_element.element = e;

          if (head == null)
          {
              new_element.next = head;
              head = new_element;
              tail = head;
          }
          else
          {
              tail.next = new_element;
              new_element.previous = tail;
              tail = new_element;
          }
          return true;
   }

   public void remove(int n)
   {
       LinkEntry<E> remove_this = new LinkEntry<E>();

       //if nothing comes before remove_this, set the head to equal the element after remove_this
       if (remove_this.previous == null)
           head = remove_this.next;

       //if nothing comes after remove_this, set the tail equal to the element before remove_this
       else if (remove_this.next == null)
           tail = remove_this.previous;
       //otherwise set the next element's previous pointer to the element before remove_this
       else
       {
           //if remove_this is located in the middle of the list, enter this loop until it is
           //found, then remove it, closing the gap afterwards.
           int i = 0;
           for (remove_this = head; remove_this != null; remove_this = remove_this.next)
           {
               //if i == n, stop and delete 'remove_this' from the list
               if (i == n)
               {               
                   //set the previous element's next to the element that comes after remove_this
                   remove_this.previous.next = remove_this.next;
                   //set the element after remove_this' previous pointer to the element before remove_this
                   remove_this.next.previous = remove_this.previous;
                   break;
               }
               //if i != n, keep iterating through the list
               i++; 
           }
       }
   }

   /*
    * Print the doubly linked list starting at the beginning.
    */
   public void print_from_beginning()
   {
      LinkEntry<E> current = new LinkEntry<E>();
      for (current = head; current != null; current = current.next)
      {
          System.out.print(current.element + " ");
      }
   }

   /*
    * Print the doubly linked list starting the end.
    */
   public void print_from_end()
   {
      LinkEntry<E> current = new LinkEntry<E>();
      for (current = tail; current != null; current = current.previous)
      {
          System.out.print(current.element + " ");
      }
   }

   /* ------------------------------------------------------------------- */
   /* Inner classes                                                      */
   protected class LinkEntry<E>
   {
      protected E element;
      protected LinkEntry<E> next;
      protected LinkEntry<E> previous;

      protected LinkEntry() { element = null; next = previous = null; }
   }
   /* ------------------------------------------------------------------- */
   protected class DblLinkedListImplIterate<E> implements Iterator<E>
   {

       protected LinkEntry<E> next;

       protected DblLinkedListImplIterate()
       {
           next = (LinkEntry<E>) head;
       }

    @Override
    public boolean hasNext() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public E next() {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public void remove() {
        // TODO Auto-generated method stub
    }   
   }
}

And my main class that I test my methods in is:

package week6;

public class App {

    public static <E> void main(String[] args) {

        DblLinkedList<String> list = new DblLinkedList<String>();

        list.add("Bill");
        list.add("Rohan");
        list.add("James");
        list.add("Krishna");
        list.add("Javier");
        list.add("Lisa");

        System.out.println("List size after all names are added: " + list.size());

        //a. Print the linked list starting at the beginning.
        System.out.println("\nPrint the linked list starting at the beginning:");
        list.print_from_beginning();
        System.out.println();

        //b. Print the linked list starting at the end.
        System.out.println("\nPrint the linked list starting at the end:");
        list.print_from_end();
        System.out.println();

        //c. Remove Bill and print the linked list starting from beginning.
        System.out.println("\nRemove Bill and print the linked list starting from beginning:");
        list.remove(1);
        list.print_from_beginning();
        System.out.println();

        //d. Remove Lisa and print the linked list starting from end.
        System.out.println("\nRemove Lisa and print the linked list starting from end:");
        list.remove(5);
        list.print_from_end();
        System.out.println();

        //e. Remove Krishna and print the linked list starting from the beginning.
        System.out.println("\nRemove Krishna and print the linked list starting from the beginning:");
        list.remove(2);
        list.print_from_beginning();
        System.out.println();

        System.out.println("\nList size: " + list.size());

    }
}

The result that prints out after I run the program is:

List size after all names are added: 6

Print the linked list starting at the beginning:
Bill Rohan James Krishna Javier Lisa 

Print the linked list starting at the end:
Lisa Javier Krishna James Rohan Bill 

Remove Bill and print the linked list starting from beginning:


Remove Lisa and print the linked list starting from end:
Lisa Javier Krishna James Rohan Bill


Remove Krishna and print the linked list starting from the beginning:


List size: 0

By adding two if blocks to handle first and last, you have added 2 more executable blocks to run in addition to what was before. Now all three blocks are getting executed together. I believe you are trying to do something like this(execute only one block at a time):

   public void remove(int n)
   {
       LinkEntry<E> remove_this = new LinkEntry<E>();
      //if remove_this is located in the middle of the list, enter this loop until it is
       //found, then remove it, closing the gap afterwards.
       int i = 0;
       boolean removed = false;
       remove_this = head;

       while(removed == false){
           //if nothing comes before remove_this, set the head to equal the element after remove_this
           if (remove_this.previous == null){
               head = remove_this.next;
               head.previous = null;
               removed = true;
           }

           //if nothing comes after remove_this, set the tail equal to the element before remove_this
           else if (remove_this.next == null){
               tail = remove_this.previous;
               tail.next = null;
               removed = true;
           }
           //otherwise set the next element's previous pointer to the element before remove_this
           else{
               //if i == n, stop and delete 'remove_this' from the list
               if (i == n) {               
                   //set the previous element's next to the element that comes after remove_this
                   remove_this.previous.next = remove_this.next;
                   //set the element after remove_this' previous pointer to the element before remove_this
                   remove_this.next.previous = remove_this.previous;
                   removed = true;
                   break;
               }
               //if i != n, keep iterating through the list
           }
           if(!removed){
               remove_this = remove_this.next;
           }
           i++; 
       }
   }

Please Note: When you are assigning head or tail in first if else conditions, at that time, remove_this is empty and hence making your head or tail as null and you print program is not printing anything.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM