使用节点接收字符的链表

Linked List using nodes to intake characters

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

这是我目前所拥有的,也是我被困了大约一个星期的地方...

导入 TerminalIO.*;

public class 链表 {

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);

}

}

构造函数:

public class节点{

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) 吗? y

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

无论我输入什么字母,都会发生这种情况,因为我输入的字母与其自身列表中的字母相同...

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

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

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

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

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

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

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

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

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

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

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

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

如果有人能帮助我指出正确的方向或编写代码,那将是有益的,因为老实说,我现在不知道应该如何操纵节点来执行我希望它们执行的操作.

我们缺少您定义 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 这是将字母添加到列表末尾的简单情况)。一个提示,所有这些都有现有的 Whosebug 答案。就在这周,我已经在链表上回答了 3 或 4 个问题。