链接列表使用节点来摄取字符

时间:2015-04-01 18:34:01

标签: java linked-list character nodes

所以,我正在试图弄清楚如何为家庭作业做以下事情:请写一个程序,询问用户一个字母。在链表的末尾插入字母并打印出链表。请求另一个字母并插入链表的末尾并打印出列表。继续,直到用户声明他们没有更多的信件输入。然后,构建另一个链接列表,该列表将一次一个地询问用户一个字母,然后按字母顺序将其插入列表。每次插入后,打印出列表并继续,直到用户输入完字母为止。

这是我到目前为止所做的,现在我被困了一个星期......

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

}

}

构造

public class Node {

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
链表:周一 你想输入另一个字母(y / n)吗? y

输入一封信:e
链表:mone
你想输入另一个字母(y / n)吗? y

输入一封信:y
链表:钱
你想输入另一个字母(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

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

1 个答案:

答案 0 :(得分:0)

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

start = start.nodeptr;

这不是一种正确的做事方式。链接列表头(也称为 start 指针)只应在添加第一个字母时设置为ONCE,然后在循环中的后续传递中不会更改。

此外,在此代码段中:

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

您正在循环 temp ,但始终打印 start.letter

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

所以我会按照以下方式修改您的代码,但由于我没有您的Node定义,因此下面可能会出现一些错误。

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个。