【问题标题】:Adding Node to Initially Null LinkedList将节点添加到最初为空的 LinkedList
【发布时间】:2016-03-04 21:25:27
【问题描述】:

当我尝试将节点添加到初始化为 null 的链表时遇到问题。在我的方法中,我设置了一个测试用例来检查节点最初是否为空,如果是,它会使用传入的值创建一个新节点。但无论出于何种原因,除非节点至少有一个元素已经通过,否则它不起作用进去看看:

    Node addNode(Node node, int val)
    {
        if(node == null)
            {
                Node newNode = new Node(val);
                //node = newNode;
                return newNode;
            }
        node.next = addNode(node.next, val);
        return node;
    }

//Driver Class
    Scanner in = new Scanner(System.in);
    Node myNode = new Node(1);
    int numEntries = in.nextInt();
    for(int i = 0 ; i < numEntries ; i++)
    {
        int inputVal = in.nextInt();
        myNode.addNode(myNode, inputVal);
    }

如果myNode被初始化为空值(Node myNode = null;),上面的代码将不会运行

完整代码:

/* package whatever; // don't place package name! */

   import java.util.*;
   import java.lang.*;
   import java.io.*;




/* Name of the class has to be "Main" only if the class is public. */
    class Ideone
    {
     public static class Node
     {
         private int value;
         Node next;
         public Node()
         {
             next = null;
         }
         public Node(int val)
         {
            value = val;
            next = null;
        }
        Node addNode(Node node, int val)
        {
            if(node == null)
                {
                    Node newNode = new Node(val);
                    //node = newNode;
                    return newNode;
                }
            node.next = addNode(node.next, val);
            return node;
        }
    }

    public static void main (String[] args) throws java.lang.Exception
    {
        Scanner in = new Scanner(System.in);
        Node myNode = new Node(1);
        Node current = null;
        Node oddFirst = new Node(1);
        int numEntries = in.nextInt();
        for(int i = 0 ; i < numEntries ; i++)
        {
            int inputVal = in.nextInt();
            myNode.addNode(myNode, inputVal);
        }
        current = myNode;
        while(current != null) // Check if values were copied correctly
        {
            if(oddFirst == null) 
            {
                oddFirst = new Node(current.value);
            }
            oddFirst.addNode(oddFirst,current.value);
            //oddFirst = current.next;
            //oddFirst = oddFirst.next;
            current = current.next.next;
        }
        while(oddFirst != null)
        {
            System.out.println("Current Value: " + oddFirst.value);
            oddFirst = oddFirst.next;
        }
    }
}

【问题讨论】:

  • 你是说你试图将myNode初始化为null,然后在for循环中调用myNode.addNode()
  • @gla3dr 是的,这就是我的意思。
  • 为什么不使用 java.util.LinkedList?并简单地做 list.add(new Node(inputVal));您是否有不允许标准库中现有的链表实现的特殊需求?
  • @reegnz 我正在练习面试,所以我应该知道如何从头开始实现链表
  • 好吧,首先你不能在 null 上调用像 addNode 这样的方法。

标签: java algorithm list recursion null


【解决方案1】:

链表的简单解决方案:

class Node {
    int val;
    Node next;
}

public class LinkedList {
    public Node first;
    public Node last;
    public void addNext(int val) {
        Node node = new Node();
        node.val = val;
        if(last == null) {
            first = last = node;
        }
        else {
            last.next = node;
            last = node;
        }
    }
}

原始代码的主要问题是它不关心空列表的情况。 您无法辨别列表由单个 1 值和空列表组成的情况。

【讨论】:

  • @MannyO 实际上该解决方案是 java.util.LinkedList 解决方案的简化版本。你真的应该阅读代码。编程主要是读源代码,而不是写代码。
  • 是的,我认为阅读源代码并尝试更好地理解它。谢谢大佬
【解决方案2】:

因为您没有处理 addNode() 的返回值。

您在以下函数中返回一个节点:

Node addNode(Node node, int val)

但您不在这里处理退货:

myNode.addNode(myNode, inputVal);

这应该可以帮助您找出解决方案。

【讨论】:

  • 嗯,你是什么意思?
  • 查看addNode()。你正在返回一个“节点”。你在哪里处理那个返回值??
  • 这与它无关。主要问题是空值。即使你处理返回值,你也必须从他的解决方案中的一些东西开始。
  • 试试 myNode = myNode.addNode(myNode, inputVal);
  • myNode = myNode.addNode(myNode, inputVal);没用
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多