如何查找链接列表中的第一个值



我有一个链表,我需要通过getFirst方法找到列表中的第一个值。如果值为null,我需要显示一条错误消息并退出程序。链接列表已经给了我链接,所以:

class MyLinkedList
{
private class Node            // inner class
{
private Node link;
private int x;
}
//----------------------------------
private Node first = null;    // initial value is null
//----------------------------------
public void addFirst(int d)
{
Node newNode = new Node(); // create new node
newNode.x = d;             // init data field in new node
newNode.link = first;      // new node points to first node
first = newNode;           // first now points to new node
}
//----------------------------------
public void traverse()
{
Node p = first;
while (p != null)            // do loop until p goes null
{
System.out.println(p.x);  // display data
p = p.link;               // move p to next node
}
}
}
//==============================================
class TestMyLinkedList
{
public static void main(String[] args)
{
MyLinkedList list = new MyLinkedList();
list.addFirst(1);
list.addFirst(2);
list.addFirst(3);
System.out.println("Numbers on list");
list.traverse();
}
}

以下是我尝试的方法:

public static Node getFirst(Node list)
{
if (list == null)
{
System.out.println("Error!");
System.exit(1);
}
return MyLinkedList.first;
}

我知道这不完全正确,我们刚在课堂上开始,所以我很难理解它是怎么回事。谢谢!

我认为你应该看看https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html并初步了解链表的行为。一旦你对它的行为有了想法,你就可以考虑如何在它周围添加功能。现在你只需要一个方法,你可以调用比你应该调用的更多的方法。同样可能有帮助的是创建一个接口并记录它,这样你就知道每种方法应该做什么

为了完成问题中描述的内容,您应该首先检查是否为null。此外,第一个节点自动引用自己有点奇怪,因为通常在添加另一个节点之前,它都是空的

请注意,第一个值链接到第一个Node,其中为null。然后你必须检查两件事

  1. Node == null(你得到了(
  2. Node.next == null(你必须这样做(

Node.next == null。这意味着Node是第一个值,因为它被链接到具有是null的初始Node

然后你有

public static Node getFirst(Node list)
{
// if the list is empty
if (list == null)
{
System.out.println("Error!");
System.exit(1);
} else if(list.link == null) {
// this is the first value!
return list;
} else {
// keep searching recursive with the next Node
return getFirst(list.link);
}
}

问题中的类MyLinkedList遵循堆栈数据结构的模式(在我编写此答案时(。也就是说:每次添加新元素时,该新元素都会将先前添加的元素替换为第一个元素。

如果按顺序添加了元素123,我想您希望获得1作为第一个元素。如果我错了,请纠正我。

在这种情况下,你的链表和它的检索应该是这样的:

(注意:我避免了privatevars、publicgetter、setter等;以使代码易于阅读。但读者应该添加它们。(

class Node{ int x; Node next; }
class LinkedList
{ Node head,tail;
void add(int y)
{ Node node = new Node();
node.x=y;
if(head==null)
head = tail = node;
else
tail = tail.next = node;
}
int getFirst()
{ if(head!=null)
return head.x;
else
throw new java.util.NoSuchElementException("List is empty");
}
}

如果您查看java.util.LinkedList,您会发现传统上在链表中使用的方法。如果这不是一个家庭作业问题,那么我建议你不要重新发明轮子。只需使用现有的库。

如果你必须使用堆栈数据结构,而你不能更改它,那么我建议你必须像这样更改你的getFirst()

int getFirst()
{ if(tail!=null)
return tail.x;
else
throw new java.util.NoSuchElementException("List is empty");
}

如果您不允许在代码中添加Node tail,那么您的getFirst()将如下所示:

int getFirst()
{ if(head==null)
throw new java.util.NoSuchElementException("List is empty");
Node node = head;
while(node.next!=null)
node=node.next;
return node.x;
}

相关内容

  • 没有找到相关文章

最新更新