我正在尝试将字符串存储在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()
答案 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
}