如何在链表中找到第一个值?

时间:2018-12-05 03:20:10

标签: java methods linked-list

我有一个链表,我需要通过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();
   }
}

我知道这并不完全正确,我们刚刚在我的课堂上开始了这个工作,所以我很难理解它发生了什么。谢谢!

4 个答案:

答案 0 :(得分:0)

我认为您应该查看https://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html并初步了解链接列表的行为。一旦了解了其行为方式,就可以考虑如何在其周围添加功能。现在,您只有一个方法,而该方法的调用次数超出了您的预期。可能还会有用的是创建一个接口并记录下来,以便您知道每种方法应该做什么。

答案 1 :(得分:0)

您应该检查first不为null以便执行问题中的描述。另外,第一个节点自动引用自身也很奇怪,因为通常在添加另一个节点之前,它会保留为空

答案 2 :(得分:0)

请注意,第一个值与Node链接到第一个null。那你得检查两件事

  1. Node == null(您明白了)
  2. 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遵循堆栈数据结构的模式(在我编写此答案时)。也就是说:每次添加新元素时,新元素都会替换先前添加的元素作为第一个元素。

如果您已按顺序添加了元素112,我想您想将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;
  }