【问题标题】:Linked List using nodes to intake characters使用节点获取字符的链表
【发布时间】:2015-04-01 18:34:01
【问题描述】:

所以,我想弄清楚如何为家庭作业执行以下操作:请编写一个程序,要求用户输入一个字母。在链表末尾插入字母并打印出链表。要求另一个字母并插入到链表的末尾并打印出链表。继续,直到用户声明他们没有更多的字母要输入。然后,构建另一个链接列表,它会要求用户输入一个字母,一次一个,然后按字母顺序将其插入到列表中。每次插入后,打印出列表并继续,直到用户输入完字母。

这就是我到目前为止所拥有的,并且我已经被困了大约一个星期了......

导入 TerminalIO.*;

公共类 LinkedLists {

public static void addLine(){
    System.out.println("");
}

public static void main(String[] args) {

    String answer = "y";
    String n = null;
    char nodePointer = ' ';
    KeyboardReader reader = new KeyboardReader();

    Node start = new Node();
    Node temp = new Node();

    do{
        System.out.print("Enter a letter: ");
        nodePointer = reader.readChar();
        start.letter = nodePointer;

        start.nodeptr = new Node(start.letter);
        //start.nodeptr.letter = temp.letter;
        start = start.nodeptr;

        System.out.print("Linked list: ");

        temp = start;
        while(temp != null){
            System.out.print(start.letter);
            temp = temp.nodeptr;
        }
        addLine();

        System.out.print("Would you like to enter another letter (y/n)? ");
        n = reader.readLine();

        addLine();
    }while(answer.compareTo(n) == 0);

}

}

构造函数:

公共类节点{

char letter;
Node nodeptr;

Node(){
    letter = ' ';
    nodeptr = null;
}

Node(char x){
    letter = x;
    nodeptr = null;
}

Node(char x, Node y){
    letter = x;
    nodeptr = y;
}

}

我得到的输出是:

输入一个字母:m
链表:m
您要输入另一个字母 (y/n) 吗?是的

输入一个字母:o
链表:o
您要输入另一个字母 (y/n) 吗? n

无论我输入什么字母都会这样,因为我输入的字母与它自己的列表中出现的字母相同...

它应该输出什么(第一部分):

输入一个字母:m
链表:m
您要输入另一个字母 (y/n) 吗?是的

输入一个字母:o
链表:mo
您要输入另一个字母 (y/n) 吗?是的

输入一个字母:n
链表:mon
您要输入另一个字母 (y/n) 吗?是的

输入一个字母:e
链表:mone
您要输入另一个字母 (y/n) 吗?是的

输入一个字母:y
链表:钱
您要输入另一个字母 (y/n) 吗?是的

那么对于程序的第二部分,它应该按字母顺序输出,如下所示:

输入一个字母:m
链表:m
您要输入另一个字母 (y/n) 吗?是的

输入一个字母:o
链表:mo
您要输入另一个字母 (y/n) 吗?是的

输入一个字母:n
链表:mno
您要输入另一个字母 (y/n) 吗?是的

输入一个字母:e
链表:emno
您要输入另一个字母 (y/n) 吗?是的

输入一个字母:y
链表:emnoy
您要输入另一个字母 (y/n) 吗?是的

如果有人可以帮助我指出正确的方向或编写代码,那两者都是有益的,因为我现在真的迷失了,我应该如何操纵节点来做我想让他们做的事情。

【问题讨论】:

  • 告诉我们更多关于你得到的输出。这将使人们更容易为您提供帮助。
  • 修复了输出。感谢 Isaac 告诉我这件事。

标签: java linked-list character nodes


【解决方案1】:

我们缺少定义 Node.js 的部分代码。然而,即使没有这个,我也可以看到你的 start 指针在你的循环中被重置,因为你在循环中通过这一行输入的每个字母:

start = start.nodeptr;

这不是做事的正确方式。一个链表头(也就是你的 start 指针)应该只在添加第一个字母时设置一次,然后在随后的循环中永远不会改变。

另外,在这段代码中:

temp = start;
while(temp != null){
    System.out.print(start.letter);
    temp = temp.nodeptr;
}

您在 temp 上循环,但总是打印出 start.letter

如果我要修改你的代码,你应该将每个新字母构建到你的 temp 指针中,并且只设置 start = tempstart 为 NULL 时。您还应该维护一个链表尾部(也称为 last 指针),以便将下一个字母快速插入到链表的末尾。

所以我会如下调整你的代码,但由于我没有你的节点定义,下面可能会出现一些错误。

public static void main(String[] args) {

    String answer = "y";
    String n = null;
    char nodePointer = ' ';
    KeyboardReader reader = new KeyboardReader();

    Node start = NULL;
    Node last = NULL;
    Node temp = NULL;

    do{
        System.out.print("Enter a letter: ");
        nodePointer = reader.readChar();

        temp = new Node(nodePointer);
        temp.nodeptr = NULL;
        if (start == NULL) start = temp;
        if (last != NULL) last.nodeptr = temp;
        last = temp;

        System.out.print("Linked list: ");

        temp = start;
        while(temp != null){
            System.out.print(temp.letter);
            temp = temp.nodeptr;
        }
        addLine();

        System.out.print("Would you like to enter another letter (y/n)? ");
        n = reader.readLine();

        addLine();
    }while(answer.compareTo(n) == 0);

}

我将把它留给你来完成你的任务的第二部分......当你必须按字母顺序将新字母插入到链表的开头、中间或结尾(而不是第 1 部分只是将字母添加到列表末尾的简单情况)。一个提示,所有这些都有现有的 StackOverflow 答案。就在这周,我在链表上回答了 3 或 4 个。

【讨论】:

  • 感谢cybermike!老实说,我只在 Google 上搜索过这类问题的答案,但找不到与我需要做的事情直接相关的任何内容。
  • 作为仅供参考,请检查您的问题右侧的“相关”列(以及您最初通过谷歌搜索找到的其他所有人的问题)。引用了一些相关的答案。
  • 是的,这是我第一次在 Stack 上发帖,所以我想我会发布自己的问题。原来你回答的代码有一个小问题,因为它在 m 之后停止输出字母。因此,例如,如果我输入 m,那么 o 它将输出 mo。然后当我输入 n 时,它输出 mn 而不是 mon。有什么快速解决方法吗?我将包含我正在使用的节点的构造函数。
  • 哦,我确实有一个错误,我在上面发布的代码中修复了它。在将前一个最后一个条目调整为指向新的最后一个条目后,我忘记将 last 指针设置为新的最后一个条目。我修改了两行代码以使其正确高效。
  • 太棒了,谢谢麦克,我现在要弄清楚程序的第二部分!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-24
  • 1970-01-01
  • 1970-01-01
  • 2015-02-20
  • 2014-12-16
相关资源
最近更新 更多