在链表的开头插入

Insertion at beginning in the linked list

我是数据结构的初学者。我试图在链表的开头插入一个新节点。但是根本没有插入节点。问题仅出现在开始时的插入中。 请帮我 这是我的代码

public class singlylinkedlist {
link head;
static class link
{
    int data;
    link nextNode;
    link(int dat)
    {
        data=dat;
        nextNode=null;
    }
}
public static void insertbegin(link head,int x)
{
    link newnode=new link(x);
    newnode.nextNode=head;
    head=newnode;
}
static void display(link head)
{
    if(head==null) System.out.println("empty list");
    else
    {
        link temp=head;
        while(temp!=null)
        {
            System.out.println(temp.data);
            temp=temp.nextNode;
        }
    }
}
public static void main(String args[])
{
    singlylinkedlist link=new singlylinkedlist();
    link.head=new link(2);
    insertbegin(link.head,1);
    display(link.head);
    }
}

提前致谢

首先,我强烈建议您重命名 classes。 Java classes 应始终以大写字母开头(大驼峰式)。并且变量和方法应该始终是小驼峰式(例外:静态最终变量通常是 all-caps)。

现在回答您的问题:您的错误在于以下几点:在您的方法中,如果您将新值分配给提供给该方法的 head 变量,则该更改只会影响变量 head 给方法(仅在方法范围内)。如果要更改实际的 head 变量,则需要将新值直接分配给 classes head 变量。

根据你的use-case,有3种解决方案:

  1. 您需要 LinkedList 实现的多个实例:
    • 将方法 insertBegindisplay 更改为 non-static。
    • 删除方法的第一个参数,因为它们现在可以访问 class
    • 的变量 head
  2. 您只需要一个 LinkedList 实现实例(这不是一个很好的解决方案):
    • 在 class static
    • 中创建你的 head 变量
    • 删除方法的第一个参数,因为它们现在可以访问 class
    • 的变量 head
  3. 您想为 variables/methods 保留 static/non-static 模式(无论出于何种原因):
    • 更改 head 变量的行为:它现在从不存储实际数据,而是将实际头部(带有数据)存储为其 nextNode 变量。
    • display 现在总是从 head.nextValue
    • 开始读取
    • insertBegin 现在不必覆盖实际的 head 变量。它只需要将其 nextNode 变量设置为新的 head

如果你愿意,我可以举一个例子来说明其中一个案例。我只是不想把它们都写出来让你自己想办法。


如果您想提高 Java 技能,我还建议您查看变量和方法的各种可见性选项(私有、受保护、public、默认)

您的代码有很多错误。这不是编写链表的方式。请参阅 @MichaelRitter 的回答并更正它们。

使 singlylinkedlist class 中的所有函数成为非静态的,将 link class 移到 singlylinkedlist class 之外并写入 main() 方法在 singlylinkedlist class 之外的另一个 class 中。

就你的insertbegin()方法而言,你首先要做到non-static。此外,您只需要接受要在开头插入的函数参数中的整数值;取链表的头节点在这里没有用。此外,您需要在执行任何操作之前检查链表的头节点是否为 null ,否则您将得到 NullPointerException.

这是 singlylinkedlist class 的 insertbegin() 方法的工作版本:

public void insertbegin(int x){
    link temp = new link(x);
    if(head == null)
        head = temp;
    else{
        link ts = head;
        head = temp;
        head.nextNode = ts;
    }
}

如果你想在名为link的单链表的开头插入1,你可以调用insertbegin()函数:

link.insertbegin(1);

希望对您有所帮助。