【问题标题】:Putting Character Nodes in Alphabetical Order within a Linked List在链表中按字母顺序放置字符节点
【发布时间】:2015-04-19 03:11:35
【问题描述】:

我一直试图弄清楚如何做到这一点,但我就是不知道我做错了什么。我需要做的是使用字符创建一个链接列表,并按字母顺序显示列表。

主程序:

public static void main(String[] args) {

    String n = null;
    char newChar = ' ';
    KeyboardReader reader = new KeyboardReader();

    Node start = null;
    Node last = null;
    Node temp = null;

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

                temp = new Node(newChar);

                if (start == null)
                     start = temp;
                if (last != null){ 
                    last.nodeptr = temp;
                }
                last = temp;

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

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

            }while(n.compareTo("y") == 0);

            System.out.println("The following will output a linked list created in alphabetical order.");
            addLine();

            start = null;
            last = null;
            temp = null;

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

                temp = new Node(newChar);

                if(start == null){
                    start = temp;
                    last = temp;
                }

                //~~ CAUSING ISSUES ~~
                //if(last != null)
                    //last.nodeptr = temp;


                //insert before
                if(temp.letter < start.letter){
                    temp.nodeptr = start;
                    start = temp;   
                }

                //insert at middle or end
                else{
                    if(last.letter < temp.letter){
                        last.nodeptr = temp;
                        temp = last;
                    }
                    if(last.letter > temp.letter){
                        temp.nodeptr = last;
                        last = temp;
                    }
                }

                //For testing purposes
                /*else{
                    if(temp.letter > start.letter){
                        if(start.nodeptr != null){
                            while(temp.letter > start.nodeptr.letter){
                                temp.nodeptr = start;
                                start = temp;
                            }
                        }
                    }
                    else if(temp.letter < last.letter){
                        if(last.nodeptr != null){
                            while(temp.letter < last.nodeptr.letter){
                                last.nodeptr = temp;
                                last = temp;
                            }
                        }
                    }
                }
                */

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

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

            }while(n.compareTo("y") == 0);
}    

当前输出(与注释掉的东西一样):

Enter a letter: m  
Linked list: m  
Would you like to enter another letter (y/n)? y  

Enter a letter: o  
Linked list: mo  
Would you like to enter another letter (y/n)? y  

Enter a letter: n  
Linked list: mon  
Would you like to enter another letter (y/n)? y  

Enter a letter: e   
Linked list: mone  
Would you like to enter another letter (y/n)? y  

Enter a letter: y  
Linked list: money  
Would you like to enter another letter (y/n)? n  

The following will output a linked list created in alphabetical order.  

Enter a letter: m  
Linked list: m  
Would you like to enter another letter (y/n)? y  

Enter a letter: o  
Linked list: mo  
Would you like to enter another letter (y/n)? y  

Enter a letter: n  
Linked list: mn  
Would you like to enter another letter (y/n)? n     

我想出了程序的第一部分,它只是在用户输入每个字符时插入。但是,现在我必须按字母顺序排列它,我想我指出了我的问题,我认为这是由于 Last 节点。我在程序中将其注释掉并运行,但不正确。如果我不加注释,它会形成一个循环,基本上会破坏程序。

如果有人可以帮助我修复代码并使其 100% 正常工作,我们将不胜感激!

【问题讨论】:

    标签: java linked-list character alphabetical


    【解决方案1】:

    在向列表中添加新角色时,基本上需要考虑四种情况:

    1. 如果列表为空,则新字符将成为列表的头部和尾部。
    2. 如果新字符在链表头节点之前,则它成为链表头并指向旧链表头。
    3. 如果新字符出现在列表尾部的节点之后,则它成为列表的尾部,旧的尾部节点指向它。
    4. 如果这些都不为真,则该节点位于列表中间的某个位置。

    案例 1 和 2 看起来是正确的:

    if(start == null){
        start = temp;
        last = temp;
    }
    
    //insert before
    if(temp.letter < start.letter){
        temp.nodeptr = start;
        start = temp;   
    }
    

    案例 3 有一个小错误:

    if(last.letter < temp.letter){
        last.nodeptr = temp;
        temp = last;
    }
    

    我认为您在这里需要last = temp 而不是temp = last,因为temp 应该作为列表中的最后一个节点。这就是为什么在输入“M”和“O”后输入“N”时,“O”消失了。

    案例 4 是您需要做一些工作的案例。因为新节点可以位于列表中的任何位置,并且列表可以包含任意数量的元素,所以您无法像目前所做的那样仅使用一系列 if 语句来完成它。相反,您需要使用循环遍历列表并找到合适的位置来插入新节点。这足以让你继续前进吗?

    【讨论】:

    • 所以对于第 4 种情况,我将不得不使用 while 语句对吗?我想我在我评论它的部分搞砸了它:出于测试目的。会不会和那个一样?
    • 正确:您需要使用 while 循环遍历列表。但是,您注释掉的代码在循环的每次迭代中都会更改 startlast 的值,而您不想这样做。应该恰好有一个循环迭代对列表进行任何更改:识别新节点的正确位置的迭代。您可能需要声明一个新的 Node 变量来表示您当前正在检查的列表节点。
    • 好吧,我早上会玩一下。希望我能弄明白,如果不是,我明天可能会再次在这里发表评论。感谢乔的帮助!
    • 没问题。祝你好运!
    • 所以到目前为止,我无法弄清楚为什么在用户输入两个字符后列表停止的代码...我将 temp = last 更改为 last = temp,但是现在它在输入 n 后只显示“mo”而不是“mn”。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-10
    • 2014-03-12
    • 2012-11-05
    • 2021-03-02
    • 2019-01-25
    相关资源
    最近更新 更多