【问题标题】:LinkedList (built from scratch) add() not workingLinkedList(从头开始构建)add()不起作用
【发布时间】:2021-02-05 04:25:08
【问题描述】:

我正在做一个课堂作业,我必须从头开始构建一个单链表类。我的问题是,当我遍历一系列项目并将它们添加到链表时,我的 add() 方法无法正常工作。更具体地说,1)它复制了系列中的第一个,2)它没有添加系列中的最后一个。我在 ManualLinkedList 类中的 add() 方法有什么问题?

public class test {
    static class ManualLinkedList<T> {
        private static class Node<T> {
            T item;
            Node<T> next;
            Node<T> prev;

            public T getItem() {
                    return item;
                }
            public ManualLinkedList.Node<T> getNext() {
                    return next;
                }

            Node(Node<T> prev, T element, Node<T> next) {
                this.item = element;
                this.next = next;
                this.prev = prev;
            }
        }

        Node<T> head;
        Node<T> tail;
        int size = 0;

        public void add(T t) {
            final Node<T> l = tail;
            final Node<T> newNode = new Node<>(l, t, null);
            tail = newNode;
            if (l == null) {
                head = newNode;
            }
            else {
                l.next = newNode;
            }
            size++;
        }

        public int size() { return size; }

        public T getContentFromPosition(int position) {
            Node<T> np = head;
            T result = head.getItem();

            if (position == size) {
                result = tail.getItem();
            }
            for (int i = 1; i < size; i++) {
                if (i == position) {
                    result = np.getItem();
                }
                np = np.getNext();
            }
            return result;
        }
    } //end ManualLinkedList class


    public static void main(String[] args) {
        ManualLinkedList<Integer> test = new ManualLinkedList<>();
        test.add(1);
        test.add(2);
        test.add(3);
        test.add(4);
        test.add(5);
        test.add(6);
        test.add(7);
        test.add(8);

        for (int i =0; i < test.size; i++){
            System.out.println(test.getContentFromPosition(i));
        }
    }
}

预期输出:

1
2
3
4
5
6
7
8

实际输出:

1
1  // notice the duplicate first item
2
3
4
5
6
7  // notice the missing 8, or the last input

【问题讨论】:

  • 请注意,单链表节点只有一个指向下一个元素的ptr。它不包含 ptr to prev entry。

标签: java linked-list add doubly-linked-list


【解决方案1】:

主要问题

  1. 索引在调用期间用作0..size-1
  2. forgetContentFromPosition 中的循环应该来自0..size-1
  3. getContentFromPosition 中使用 size == position 无关紧要

代码

        public T getContentFromPosition(int position) {
            if (position >= size) {
                return null;
            }
            Node<T> np = head;
            T result = head.getItem();
            if (position == size - 1) {
                result = tail.getItem();
            }
            for (int i = 0; i < size; i++) {
                if (i == position) {
                    result = np.getItem();
                    break;
                }
                np = np.next;
            }
            return result;
        }
    } //end ManualLinkedList class


    public static void main(String[] args) {
        ManualLinkedList<Integer> test = new ManualLinkedList<>();
        test.add(1);
        test.add(2);
        test.add(3);
        test.add(4);
        test.add(5);
        test.add(6);
        test.add(7);
        test.add(8);

        for (int i = 0; i < test.size; i++){
            System.out.println(test.getContentFromPosition(i));
        }
    }

【讨论】:

    【解决方案2】:

    您的add 函数实际上很好。

    但是,您的 getContentFromPosition 函数几乎是正确的,但需要做一些工作。您应该决定列表中的位置是从 0 开始计数还是从 1 开始计数。例如,如果列表中有 3 个元素,它们是位置 0、1、2 还是位置 1、2、3?

    当您使用 main 中的 getContentFromPosition 函数时,您假设位置从 0 开始计数,但在编写函数时,您似乎假设它们从 1 开始计数。

    如果您将getContentFromPosition 修改为从 0 开始计数,那么您可以摆脱对 position==size 的特殊情况检查,然后您将从 0 而不是 1 开始循环。另外,为了提高效率,为什么找到后不返回结果而不是让循环继续运行?

    【讨论】:

      【解决方案3】:

      你需要初始化int size=1而不是0

      并且在循环的主要方法中更改为int i=1而不是0

      【讨论】:

        【解决方案4】:

        在 getContentFromPosition 方法中,你的 for 循环应该从 0 开始。休息很好。

        for (int i = 0; i

        【讨论】:

          猜你喜欢
          • 2011-05-03
          • 2018-12-10
          • 1970-01-01
          • 1970-01-01
          • 2014-10-05
          • 1970-01-01
          • 2020-02-11
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多