创建一个链接列表,其中每个节点都连接到另一个链接列表。(java)

时间:2015-02-03 10:40:28

标签: java linked-list

我正在创建一个程序,它将读取文件,按字典顺序组织所有单词,并输出单词,文档中出现的次数以及它出现的行。我已经在四个不同的类文件中实现了这个代码。但是,我无法将单词链接到链接列表,链接列表将显示链接列表到达的行号。我应该使用前后节点遍历列表,我不确定如何进行迭代这个列表并打印出每个单词。

这里是获取字符串并创建链表的类的代码:

private class Node
        implements Entry<String, IntQueue> {
    String key;
    IntQueue queue = new IntQueue();
    Node link;

    Node(String keyword, Node newlink) {
        key = keyword;
        link = newlink;
    }

    public String getKey() {
        return key;
    }

    public IntQueue getValue() {
        return queue;
    }

    public IntQueue setValue(IntQueue queue) {
        throw new UnsupportedOperationException();
    }


}

private Node head = new Node("", null);

public ListMap() {
    // Not needed, since head defaults to null anyway.
}

public void insert(String key, int linenr) {
    misc.trace("insert", key, linenr);
    Node prevcursor = head;
    Node cursor = head.link;
    boolean write = false;
    while (cursor != null) {

        if (key.compareTo(cursor.getKey()) < 0) {
            prevcursor.link = new Node(key, prevcursor.link);
            prevcursor.link.getValue().insert(linenr);
            write = true;
            break;
        }
        if (key.compareTo(cursor.getKey()) == 0) {
            cursor.queue.insert(linenr);
            write = true;
            break;
        }
        prevcursor = prevcursor.link;
        cursor = cursor.link;
    }
    if (!write) {
        prevcursor.link = new Node(key, prevcursor.link);
        prevcursor.link.getValue().insert(linenr);
    }
}

以下是实际生成int链表的代码:

  class IntQueue
            implements Iterable<Integer> {

        private class node {
            int linenr;
            node link;

            node(int number, node newlink) {
                linenr = number;
                link = newlink;
            }
        }

        private int count = 0;
        private node rear = null;
        private node front = new node(0, null);
        private int linenumb = 0;

       private int count = 0;
   private node rear = null;
   private node front = null;
   private int linenumb= 0;



     public void insert (int number) {
          ++count;
          misc.trace (count);
          if(front=null){
          node temp = new node(number,rear.link);
          front = temp;
          rear = temp;
          }else{
          if(linenumb != number ){
            rear.link= new node(number,null);
            }
          }
          linenumb = number;
          rear = rear.link;
       }

最大的问题是第二类中的插入函数。我不能理解如何链接前后,并且每次以稍后调用的方式调用函数时始终添加新节点

1 个答案:

答案 0 :(得分:0)

如果您的第一个问题是如何为insert编写IntQueue方法,那么这里有一些建议。我假设您不希望编写代码,因为这看起来很可能是一项任务。

  1. 构建列表时,您正在创建一个新节点front。这可能是个错误。该列表最初为空,通常表示为frontrearnull

  2. insert中要做的第一件事是检查front是否为空。如果是,您只需将frontrear设置为新节点。

  3. 之后您知道rear将指向最近插入的节点,因此您只需要检查要插入rear.lineNumber的新int。

  4. 假设您需要一个新节点,创建它,让rear.link指向它,然后让rear指向它。

  5. 你已经完成了。

    由于你的作业是一个链接列表,每个节点都包含一个链表,我希望你的类定义如下:

    class WordList {
        private class Node {
            private String word;
            private int count;
            private LineNumberList lineNumbers;
            private Node next;
        }
    
        private Node head;
        private Node tail;
    
        public addWord(String word, int lineNumber) {
            ...
        }
    }
    
    class LineNumberList {
        private class Node {
            private int lineNumber;
            private Node next;
        }
    
        private Node head;
        private Node tail;
    
        public addLineNumber(int lineNumber) {
            ...
        }
    }
    

    addWordaddLineNumber都应遵循与上述算法相同的模式。但是addWord需要从查找单词开始,如果不存在则插入计数为1,如果是,则递增计数。