我有一个链表,我需要通过getFirst方法在链表中找到第一个值,如果该值为空,我需要显示一条错误消息并退出程序。链接列表已提供给我链接,所以:
{
"Sid": "OnlyAllowCertainInstanceTypesToBeCreated",
"Effect": "Deny",
"Action": [
"ec2:RunInstances",
"ec2:ModifyInstanceAttribute",
],
"Resource": "*",
"Condition": {
"StringEquals": {
"ec2:InstanceType": [
"m2.xlarge",
"cg1.4xlarge",
"c3.4xlarge"
]
}
}
}
这是我尝试使用的方法:
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();
}
}
我知道这并不完全正确,我们刚刚在我的课堂上开始了这个工作,所以我很难理解它发生了什么。谢谢!
答案 0 :(得分:0)
我认为您应该查看https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html并初步了解链接列表的行为。一旦了解了其行为方式,就可以考虑如何在其周围添加功能。现在,您只有一个方法,而该方法的调用次数超出了您的预期。可能还会有用的是创建一个接口并记录下来,以便您知道每种方法应该做什么。
答案 1 :(得分:0)
您应该检查first不为null以便执行问题中的描述。另外,第一个节点自动引用自身也很奇怪,因为通常在添加另一个节点之前,它会保留为空
答案 2 :(得分:0)
请注意,第一个值与Node
链接到第一个null
。那你得检查两件事
Node == null
(您明白了)Node.next == null
(您必须这样做) Node.next == null
时。这意味着Node
是第一个值,因为它以Node
链接到初始null
。
那么你有
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);
}
}
答案 3 :(得分:0)
您问题中的类MyLinkedList
遵循堆栈数据结构的模式(在我编写此答案时)。也就是说:每次添加新元素时,新元素都会替换先前添加的元素作为第一个元素。
如果您已按顺序添加了元素1
,1
,2
,我想您想将3
作为第一个元素。如果我错了请纠正我。
在这种情况下,您的链表及其检索应如下所示:
(注意:为了避免使代码易于阅读,我避免使用private
vars,public
getter,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;
}