在 LinkedList 中按索引搜索
Searching by Index in a LinkedList
我创建了自己的链表,其中包含一首歌曲 object(标题、艺术家等)。我正在尝试添加一个功能,用户可以在其中输入索引位置,并且有关歌曲的信息会显示在该特定索引处。我无法获取索引的位置。目前我每次 运行 这个它都找不到索引处的信息。我不确定是否需要实现搜索功能,或者我只是搜索错误。
我目前是如何尝试按索引搜索的
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.");
}
这是我的链表class
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;
}
}
节点Class
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;
}
看起来更像是Song的线性搜索。您正在检查输入的值(一个 int,searchIndex)是否与 Nody.getValue() 匹配,returns 一首歌曲。
如果您尝试通过索引获取,似乎您只需调用 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;
}
建立编码风格并坚持下去!有时参数周围有 spaces,有时则没有。有时 space 在左大括号之前,有时则不需要。以上就是我的做法
在链表中,您必须遍历整个列表(遍历当前节点)才能找到对象。
您的搜索应该类似于:
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;
}
考虑到您 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.");
}
我创建了自己的链表,其中包含一首歌曲 object(标题、艺术家等)。我正在尝试添加一个功能,用户可以在其中输入索引位置,并且有关歌曲的信息会显示在该特定索引处。我无法获取索引的位置。目前我每次 运行 这个它都找不到索引处的信息。我不确定是否需要实现搜索功能,或者我只是搜索错误。
我目前是如何尝试按索引搜索的
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.");
}
这是我的链表class
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;
}
}
节点Class
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;
}
看起来更像是Song的线性搜索。您正在检查输入的值(一个 int,searchIndex)是否与 Nody.getValue() 匹配,returns 一首歌曲。
如果您尝试通过索引获取,似乎您只需调用 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; }
建立编码风格并坚持下去!有时参数周围有 spaces,有时则没有。有时 space 在左大括号之前,有时则不需要。以上就是我的做法
在链表中,您必须遍历整个列表(遍历当前节点)才能找到对象。
您的搜索应该类似于:
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;
}
考虑到您 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.");
}