【问题标题】:Linked List of Strings字符串链表
【发布时间】:2013-10-26 01:02:45
【问题描述】:

我正在尝试使用链表创建一个类似StringBuilder 的类,但我认为我在构造函数中的某个地方搞砸了。任何人都可以在这里找到问题吗?我认为问题在于我如何移动到下一个节点。

节点类:

private class CNode
{
    private char data;
    private CNode next;

    private CNode(char c)
    {
        data = c;
        next = null;
    }

    private CNode(char c, CNode nextNode)
    {
        data = c;
        next = nextNode;
    }
}

构造函数:

private CNode firstNode;
private int length;

public MyString(String s)
{
    if(s == null)
    {
        this.length = 0;
        this.firstNode = null;
    }
    else if(s.length() == 1)
    {
        this.length = 1;
        this.firstNode.data = s.charAt(0);
        this.firstNode.next = null;
    }
    else
    {
        this.length = s.length();
        CNode node = null;
        CNode nextNode = null;

        this.firstNode = new CNode(s.charAt(0), node);

        for(int i = 1; i < s.length(); i++)
        {
            node = new CNode(s.charAt(i), nextNode);
            node = node.next;
        }
    }
}

【问题讨论】:

    标签: java string linked-list


    【解决方案1】:

    我看到的一个问题是在

    this.firstNode = new CNode(s.charAt(0), node);
    

    当该行执行时,node 为空,因此您的 firstNode 最终与任何内容无关。此外,在您尝试构建链接的 for 循环中,您从不分配 nextNode,但您尝试使用它将一个节点链接到下一个节点。因此,所有节点最终都链接到null,即nextNode的初始值。

    另一个问题:

    this.firstNode.data = s.charAt(0);
    this.firstNode.next = null;
    

    这应该是创建一个新的 CNode,因为当代码执行时this.firstNode 仍然为 null,这将导致 NullPointerException。

    【讨论】:

    • 这不是目的吗?似乎字符的链接列表是以相反的顺序存储的,所以第一个字符不应该指向任何东西。 (除非那是不是的意图,在这种情况下这绝对是一个问题!)
    • 但我继续在下面的for循环中设置节点?这不能解决这个问题吗?
    • @templatetypedef 倒序?绝对不是本意。你怎么看?
    • @templatetypedef:这不是链表的工作方式,也不是他在循环中构建链接的方式(或至少尝试这样做)。
    • @Nealon:查看我的更新答案。我还指出了一些我注意到的问题,包括你的 for 循环的一些问题。
    【解决方案2】:

    这里可能还有其他问题,但是考虑一下这段代码:

    else if(s.length() == 1)
    {
        this.length = 1;
        this.firstNode.data = s.charAt(0);
        this.firstNode.next = null;
    }
    

    请注意,您从未分配过this.firstNode,这意味着您将在执行第二行代码时获得NullPointerException。在写入之前尝试分配一个节点。

    希望这会有所帮助!

    【讨论】:

    • 将后两行替换为this.firstNode = new CNode(s.charAt(0), null);?
    • @Nealon- 这绝对有帮助!
    • 优秀。仍然没有修复,但这解决了其他可能的问题。谢谢
    猜你喜欢
    • 2020-12-03
    • 1970-01-01
    • 2021-12-18
    • 2016-07-23
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多