找到正确的位置并存储在LinkedList中

时间:2014-10-17 18:28:57

标签: java sorting linked-list

我正在尝试将字符串存储在LinkedList中。我不允许预先排序,但找到该位置并将字符串传递给链表。当我通过文本文件传递字符串时,字符串不会通过最后的其他条件。 我的输入文件有 乔 APPY appz 斑马 猫

当它达到appz时,它不会通过任何声明。它应该插入最后一个else条件并打印5,但不会这样做。

/**
     * Gets the string and arranges them in order
     * @param newString
     */
    public void store(String newString) {

        LinkedListNode current = head;
        System.out.println(newString);

        // if no element in the list
        if (current==null){
            System.out.println("1");
            makeNode(newString);
        }

        // if only 1 elements in the list
        else if(current.getNext()==null ){
            System.out.println("2");
            if(newString.compareTo(current.getName())<0){
                insertBefore(current.getName(),newString);
            } else{
                insertAfter(current.getName(),newString);
            }
        }

        // if the element is smaller than the head in the list
        else if(newString.compareTo(current.getName()) < 0){
            System.out.println("3");
            LinkedListNode temp = makeNode(newString);
            temp.setNext(current);
            head=temp;
        }

        // if the element is greater than the tail in the list
        else if(newString.compareTo(findTail().getName()) > 0){
            System.out.println("4");
            insertAfter(findTail().getName(),newString);
        }

        // for more than two elements in the list
        else{
            System.out.println("5");
            while(!(newString.compareTo(current.getName())>0  && newString.compareTo(current.getNext().getName())<0 ) && current.getNext()!=null){
                current=current.getNext();
            }

            if(newString.compareTo(current.getName())<0){
                insertBefore(current.getName(),newString);
            }
            else{
                insertAfter(current.getName(),newString);
            }
        }

    }   // end of store()

2 个答案:

答案 0 :(得分:0)

insertBefore存在一些问题。我更新了它。

public void insertBefore(String later, String name){
        if(head==null){
            head = new LinkedListNode(name,null);
        }
        else if(head.getName()==later){
            LinkedListNode newNode = makeNode(name);
            newNode.setNext(head);
            head=newNode;   
        }
        else{
            LinkedListNode current = head;
            while(current.getNext().getName()!=later){
                current=current.getNext();
            }
            LinkedListNode newNode = makeNode(name); // create the new node
            newNode.setNext(current.getNext());    
            current.setNext(newNode);
        }
    } // end of insertBefore()

答案 1 :(得分:-1)

当您进行移动时,您不应该更改头部参考。要遍历,只需执行此操作:

Node tmp = head;
while(tmp != null) tmp = tmp.next;

这将非常方便地确定插入新节点的位置或去除现有节点的位置。

您的类还应该有addFirst,addLast,insertBefore,insertAfter等方法。在下面的代码中,Object是您需要的任何数据类型(在您的情况下,String)

public void addLast(Object item)
{
  if(head == null)
  {
    addFirst(item);
  }
  else
  {
    Node<Object> tmp = head;
    while(tmp.next != null)
    {
      tmp = tmp.next;
    }
    tmp.next = new Node<Object>(item, null);
  }
}

public void addFirst(Object item)
{
  head = new Node<Object>(item, head);
}

public void insertAfter(Object key, Object item)
{
  Node<Object> tmp = head;
  while(tmp != null && !tmp.data.equals(key))
  {
    tmp = tmp.next;
  }

  if(tmp != null)
  {
    tmp.next = new Node<Object>(item, tmp.next);
  }
}

public void insertBefore(Object key, Object item)
{
  if(head == null)
  {
    return null;
  }

  if(head.data.equals(key))
  {
    addFirst(item);
    return;
  }

  Node<Object> previous = null;
  Node<Object> current = head;

  while(current != null && !current.data.equals(key))
  {
    previous = current;
    current = current.next;
  }

  //insert between current and previous
  if(current != null)
  {
    previous.next = new Node<Object>(item, current);
  }
}

在我看来,你不应该有一个嵌套的if / else结构来确定插入的位置。这应该取决于你要调用的方法。

其次,您用来控制代码中执行流程的条件是完全不同的。您的IF条件是列表为空。如果是,请创建一个新节点并将其添加到列表中。在该条件之后,检查仅包含一个节点的列表。之后,您不会检查列表的长度。预期的逻辑是你应该检查大于一的列表大小;然而这是你的堕落(最后的其他)。如果您要在插入方法之外进行那种检查,那么执行类似的操作(存根代码):

if (current==null){
    System.out.println("1");
    makeNode(newString);
}

// if only 1 elements in the list
else if(current.getNext()==null ){
    System.out.println("2");
    if(newString.compareTo(current.getName())<0){
        insertBefore(current.getName(),newString);
    } else{
        insertAfter(current.getName(),newString);
    }
}

// if the list has more than one element
else
{
    // figure out where it goes (before or after) and insert
}

如果你注意到,else / if和else块基本上做同样的事情。因此,您的代码可以(并且应该)简化如下:

if (current==null){
    System.out.println("1");
    makeNode(newString);
}

// if the list has one or more elements
else
{
    // figure out where it goes (before or after) and insert
}