在链接列表中按索引搜索

时间:2015-04-17 04:18:24

标签: java linked-list

我创建了自己的LinkedList,其中包含一个Song对象(标题,艺术家等等)。我试图添加一个功能,用户输入索引位置,并在该特定索引显示有关歌曲的信息。我无法获取索引的位置。目前每次我运行它都无法在索引中找到信息。我不确定是否需要实现搜索功能,或者我是否只是错误地搜索它。

我目前如何尝试按索引搜索

System.out.print("Enter song index location: ");
int searchIndex = input.nextInt();
for (int i = 0; i < list.size(); i++){
    if ( list.get(i).getValue().equals(searchIndex) ){
            System.out.println(list.get(i).getValue());
            found = true;
    }
}
if ( found != true ){
    System.out.println("Song does not exist.");
}

这是我的LinkedList类

public class LinkedList {
private Node first;
private Node last;
public LinkedList(){
    first = null;
    last = null;
}
public boolean isEmpty(){
    return first == null;
}
public int size(){
    int count = 0;
    Node p = first;
    while( p != null ){
        count++;
        p = p.getNext();
    }
    return count;
}
public Node get( int i ){
    Node prev = first;
    for(int j=1; j<=i; j++){
        prev = prev.getNext();
}
    return prev;
}
public String toString(){
    String str = "";
    Node n = first;
    while( n != null ){
        str = str + n.getValue() + " ";
         n = n.getNext();
    }
    return str;
}
public void add( Song c ){
    if( isEmpty() ) {
        first = new Node(c);
        last = first;
    }else{
        Node n = new Node(c);
        last.setNext(n);
        last = n;
    }
}

节点类

public class Node {
private Song song;
private Node next;
public Node( Song s ){
    song = s;
    next = null;
}
public Node( Song s, Node n ){
    song = s;
    next = n;
}
public Node getNext(){
    return next;
}
public void setNext(Node n){
    next = n;
}
public Song getValue(){
    return song;
}
public void setValue( Song s ){
    song = s;
}

3 个答案:

答案 0 :(得分:1)

考虑到LinkedList中的功能,您可能需要这样做:

System.out.print("Enter song index location: ");
int searchIndex = input.nextInt();
if (searchIndex >= 0 && searchIndex < list.size(){ 
   System.out.println(list.get(searchIndex).getValue());
}
else{
    System.out.println("Song does not exist.");
}

答案 1 :(得分:0)

看起来更像是Song的线性搜索。您正在检查输入的值(int,searchIndex)是否与Nody.getValue()匹配,后者返回一首歌曲。

如果您试图通过索引获取,似乎您只需调用LinkedList.get(searchIndex)?

此外:

  • 没有理由存储最后一个节点,因为您没有双向链接列表(可以从任一端导航)。您只需要第一个节点,然后使用Node.next()进行导航。

  • 通过在调用add()时递增它来维持计数,并在调用remove()时递减它,这可能更有效。

  • 您应该对get()方法进行边界检查:

    public Node get(int i) {
        if (i >= size()) {
            throw new IndexOutOfRangeException();
        }
        Node n = first;
        int j = 0;
        while (i != j) {
            n = n.getNext();
        }
        return n;
    }
    
  • 建立编码风格并坚持下去!你有时会在参数周围有空格,有时你却没有。有时在开口支撑之前的空间,有时你没有。以上是我的工作。

答案 2 :(得分:0)

在链表中,您必须遍历整个列表(迭代curr节点)才能找到对象。

您的搜索应该类似于:

if (list.isEmpty()){
    System.out.println("Song does not exist.");
}

boolean found = false;
int searchIndex = input.nextInt();

Node current = list;
    while(current != null){
        if(current.equals(searchIndex)){
        found = true; //found song
        break;
        }
    current = current.next;
    }
return current;
}