英文:
Why is the Linked List implementation not working
问题
在你提供的Java代码中,你试图学习如何实现链表。你创建了一个在链表开头插入元素的方法,但当你通过主函数运行它时,似乎没有看到任何输出返回。
以下是你的代码的翻译部分:
class ListNode{
  int data;
  ListNode next;
  ListNode(int data)
  {
    this.data = data;
    this.next = null;
  }
}
class Operations{
  static ListNode head = null;
  void insertStart(int num, ListNode head)
  {
    ListNode temp = new ListNode(num);
    if (head == null)
    {
      head = temp;
    }
    else{
      temp.next = head;
      head = temp;
    }
  }
  void display(ListNode head){
    ListNode temp = head;
    while (temp != null)
    {
      System.out.println(temp.data + "->");
      temp = temp.next;
    }
  }
  public static void main(String[] args) {
    Operations l1 = new Operations();
    l1.insertStart(5, head);
    l1.insertStart(4, head);
    l1.insertStart(3, head);
    l1.insertStart(2, head);
    l1.insertStart(1, head);
    l1.display(head);
  }
}
请注意,你的插入方法可能存在问题,因为你传递了 head 参数,但似乎没有更新 head。这可能导致你的链表操作不按预期工作。你可以考虑修改插入方法以确保 head 在插入时正确更新。
英文:
So, im trying to learn the implementation of linked list in java. I created a method to insert in the start but when i run it through main, i don't see any output returned.
class ListNode{
  int data;
  ListNode next;
  ListNode(int data)
  {
    this.data = data;
    this.next = null;
  }
}
class Operations{
  static ListNode head = null;
  void insertStart(int num, ListNode head)
  {
    ListNode temp = new ListNode(num);
    if (head == null)
    {
      head = temp;
    }
    else{
      temp.next = head;
      head = temp;
    }
  }
  void display(ListNode head){
    ListNode temp = head;
    while (temp != null)
    {
      System.out.println(temp.data+"->");
      temp = temp.next;
    }
  }
  public static void main(String[] args) {
    Operations l1 = new Operations();
    l1.insertStart(5,head);
    l1.insertStart(4, head);
    l1.insertStart(3, head);
    l1.insertStart(2, head);
    l1.insertStart(1, head);
    l1.display(head);
  }
}
Can someone please help me, i can't seem to find the error. Everything seems perfect.
答案1
得分: 1
问题在于您将head作为参数传递给您的insert方法,因此它是一个局部变量。对局部变量的任何赋值将不会被调用者看到。
但是,退一步来说,将head作为参数传递给链表实例的方法实际上是不必要的。该实例应该知道它的头是什么。这揭示了另一个问题:head不应该是类的静态成员,而应该是一个实例变量:每个Operations的实例都应该有自己的head。
这并不是问题,但insert的实现实际上不需要if...else结构。在任何情况下,都可以将temp.next赋给head,并且在任何情况下,都要设置head为temp。
因此,请按以下方式更正您的代码:
class ListNode {
  int data;
  ListNode next;
  ListNode(int data) {
    this.data = data;
    this.next = null;
  }
}
class Operations {
  ListNode head = null; // 不应该是静态的!每个实例都有自己的head
  void insertStart(int num) // head不应该是参数。使用实例变量。
  {
    ListNode temp = new ListNode(num);
    // 不需要区分空链表或非空链表:
    temp.next = head;
    head = temp;
  }
  void display() { // head不应该是参数。使用实例变量。
    ListNode temp = head;
    while (temp != null) {
      System.out.print(temp.data + "->"); // 在同一行上输出
      temp = temp.next;
    }
    System.out.println("null"); // 终止行
  }
  public static void main(String[] args) {
    Operations l1 = new Operations();
    l1.insertStart(5); // 不要将head作为参数传递。
    l1.insertStart(4);
    l1.insertStart(3);
    l1.insertStart(2);
    l1.insertStart(1);
    l1.display();
  }
}
英文:
The problem is that you pass head as an argument to your insert method, and so it is a local variable. Any assignment to a local variable will not be seen by the caller.
But, taking a step back, it should not be necessary to pass head as argument to a method of your linked list instance. That instance should know "itself" what its head is. And that reveals another problem: head should not be a static member of your class, but an instance variable: every instance of Operations should have its own head.
Not a problem, but the implementation of insert doesn't really need the if...else construct. In either case you can assign temp.next=head, and in either case you want to set head=temp.
So correct your code as follows:
class ListNode{
  int data;
  ListNode next;
  ListNode(int data)
  {
    this.data = data;
    this.next = null;
  }
}
class Operations{
  ListNode head = null; // Should not be static! Every instance has its own head
  void insertStart(int num) // head should not be an argument. Use the instance variable.
  {
    ListNode temp = new ListNode(num);
    // No distinction needed between empty list or non-empty list:
    temp.next = head;
    head = temp;
  }
  void display(){ // head should not be an argument. Use the instance variable.
    ListNode temp = head;
    while (temp != null)
    {
      System.out.print(temp.data+"->"); // Output on same line
      temp = temp.next;
    }
    System.out.println("null"); // Terminate the line
  }
  public static void main(String[] args) {
    Operations l1 = new Operations();
    l1.insertStart(5); // Don't pass the head as argument.
    l1.insertStart(4);
    l1.insertStart(3);
    l1.insertStart(2);
    l1.insertStart(1);
    l1.display();
  }
}
答案2
得分: -1
以下是已翻译的代码部分:
这是你需要做的事情:
class ListNode {
  int data;
  ListNode next;
  ListNode(int data) {
    this.data = data;
    this.next = null;
  }
}
class Operations {
  static ListNode head = null;
  void insertStart(int num) {
    ListNode temp = new ListNode(num);
    if (head == null) {
      head = temp;
    } else {
      temp.next = head;
      head = temp;
    }
  }
  void display(ListNode head) {
    ListNode temp = head;
    while (temp != null) {
      System.out.println(temp.data + "->");
      temp = temp.next;
    }
  }
  public static void main(String[] args) {
    Operations l1 = new Operations();
    l1.insertStart(5);
    l1.insertStart(4);
    l1.insertStart(3);
    l1.insertStart(2);
    l1.insertStart(1);
    l1.display(head);
  }
}
英文:
Here is what you need to do:
    class ListNode{
  int data;
  ListNode next;
  ListNode(int data)
  {
    this.data = data;
    this.next = null;
  }
}
class Operations{
  static ListNode head = null;
  void insertStart(int num)
  {
    ListNode temp = new ListNode(num);
    if (head == null)
    {
      head = temp;
    }
    else{
      temp.next = head;
      head = temp;
    }
  }
  void display(ListNode head){
    ListNode temp = head;
    while (temp != null)
    {
      System.out.println(temp.data+"->");
      temp = temp.next;
    }
  }
  public static void main(String[] args) {
    Operations l1 = new Operations();
    l1.insertStart(5);
    l1.insertStart(4);
    l1.insertStart(3);
    l1.insertStart(2);
    l1.insertStart(1);
    l1.display(head);
  }
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论