【问题标题】:Linked List in Java: Displaying last node incorrectly [closed]Java中的链表:错误地显示最后一个节点[关闭]
【发布时间】:2013-12-19 17:26:42
【问题描述】:

以下是两个类:

        import java.io.*;
class Node
{
    int data;
    Node link;
    BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
    void accept()throws IOException
    {
        System.out.println("Enter a number: ");
        data=Integer.parseInt(buf.readLine());
    }
}


import java.io.*;
class LinkedList
{
    BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
    Node start=new Node();
    void create()throws IOException
    {
        Node n=new Node();
        n.accept();
        start.link=n;
    }
    void addbeg()throws IOException
    {
        Node n=new Node();
        n.accept();
        n.link=start.link;
        start.link=n;
    }
    void addend()throws IOException
    {
        Node n=new Node();
        n.accept();
        Node n1=new Node();
        n1=start.link;
        while(n1.link!=null)
        {
            n1=n1.link;
        }
        n1.link=n;
        n.link=null;
    }
    void addafter()throws IOException
    {
        boolean flag=false;
        System.out.println("Enter data after which node is to be added: ");
        int d=Integer.parseInt(buf.readLine());
        Node n=new Node();
        n.accept();
        Node n1=start.link;
        while(n1.link!=null)
        {
            if(n1.data==d)
            {
                flag=true;
                break;
            }
            n1=n1.link;
        }
        if(flag==true)
        {
            n.link=n1.link;
            n1.link=n;
        }
        else
        System.out.println("Data is not present in the list");
    }
    void addbefore()throws IOException
    {
        boolean flag=false;
        Node n=new Node();
        n.accept();
        System.out.println("Enter the data before which node is to be added: ");
        int d=Integer.parseInt(buf.readLine());
        Node n1=start.link;
        Node prev=start;
        while(n1.link!=null)
        {
            if(n1.data==d)
            {
                n.link=n1;
                prev.link=n;
                flag=true;
                break;
            }
            else
            {
                prev=n1;
                n1=n1.link;
            }
        }
        if(flag==false)
        {
            System.out.println("Data not found");
        }
    }
    void delbeg()
    {
        Node n=start.link;
        start.link=n.link;
        n.link=null;
    }
    void delend()
    {
        Node n=start.link;
        Node prev=start;
        while(n.link!=null)
        {
            prev=n;
            n=n.link;
        }
        prev.link=null;
    }
    void delspecific()throws IOException
    {
        boolean flag=false;
        System.out.println("Enter data to be deleted: ");
        int d=Integer.parseInt(buf.readLine());
        Node n=start.link;
        Node prev=start;
        while(n.link!=null)
        {
            if(n.data==d)
            {
                prev.link=n.link;
                n.link=null;
                flag=true;
            }
            else
            {
                prev=n;
                n=n.link;
            }
        }
        if(flag==false)
        {
            System.out.println("Data is not present in the list");
        }
    }
    void display()
    {
        System.out.println("Linked List: ");
        Node n=start.link;
        do
        {
            System.out.print(n.data+" -> ");
            n=n.link;
        }
        while(n.link!=null);
        System.out.println();
    }
    void main()throws IOException
    {
        boolean flag=false;
        while(!flag)
        {
            System.out.println("Enter choice: ");
            System.out.println("1. Create ");
            System.out.println("2. Add at the Beginning ");
            System.out.println("3. Add at the End ");
            System.out.println("4. Add after a particular node ");
            System.out.println("5. Add before a particular node ");
            System.out.println("6. Delete at the Beginning ");
            System.out.println("7. Delete at the End ");
            System.out.println("8. Delete a specific node ");
            System.out.println("9. View ");
            System.out.println("10. End ");
            int ch=Integer.parseInt(buf.readLine());
            switch(ch)
            {
                case 1:create();
                break;
                case 2:addbeg();
                break;
                case 3:addend();
                break;
                case 4:addafter();
                break;
                case 5:addbefore();
                break;
                case 6:delbeg();
                break;
                case 7:delend();
                break;
                case 8:delspecific();
                break;
                case 9:display();
                break;
                case 10:flag=true;
                System.exit(0);
                break;
            }
        }
    }
}

当我执行任何函数并查看链表时,总是缺少最后一个节点。在过去的四个小时里,我一直在研究这个程序,当最后一个节点没有显示时,我感到很惊讶。请帮忙

【问题讨论】:

  • 请善待并格式化您的代码。没有缩进就很难阅读。
  • 当这种情况发生时,通过打印一些信息进行调试。您也可以单步执行代码,但这可能不是必需的。我没有查看您的代码,但可能需要几分钟才能找到错误。
  • 我不知道出了什么问题...应该是正确的...如果有人可以在他们的系统上复制并运行它,那将会很有帮助。
  • 对这个庞大的程序感到抱歉,但这就是我在过去四个小时内为它工作所创造的……虽然它很容易理解
  • 在您的 display 方法中,您从 Node n=start.link; 开始。为什么不Node n=start;?好像你错过了第一个节点

标签: java list linked-list


【解决方案1】:

注意:start 节点持有一个项目,它只是指向第一个项目的节点。

问题出在display方法中:

Node n = start.link;
do {
    System.out.print(n.data+" -> ");
    n = n.link;
} while(n.link != null);

想象n 是倒数第二个节点。我们进入循环,打印倒数第二项,设置n=n.link,即最后一个节点。接下来我们检查n.link!=null,结果是假的,因为我们在最后一个节点,所以我们没有再次进入循环,因此最后一项没有打印出来。

还要注意,如果您显示一个空列表,您将有一个NullPointerExceptionn=start.link 将设置为n=null,因为您没有任何节点。然后,您进入循环并尝试打印,这将引发异常。

它可以通过多种方式修复。例如,我们可以在实际打印之前检查当前节点n

Node n = start.link;
while(n != null){
    System.out.print(n.data+" -> ");
    n = n.link;
}

【讨论】:

  • 现在完全理解了...谢谢一百万
猜你喜欢
  • 2013-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多