【问题标题】:Implementing an ADT linked list from scratch从头开始实现 ADT 链表
【发布时间】:2015-10-30 23:14:39
【问题描述】:

我有一个类项目,我必须从头开始构建一个基于 ADT 的链表(这意味着我不能使用任何标准的 Java ADT),然后使用它对一堆 State 对象进行排序(即每个还包含一个按字母顺序排列的Cities) 链表。显然,代码的主干是手工制作的OrderedLinkedList 类,我在弄清楚如何实现,特别是迭代列表的findOrAdd 方法时遇到了很多麻烦,如果传递的参数是尚未在列表中,将其添加到适当的位置(如果元素已经存在,则返回该元素)。我读过的关于实现链表的大部分内容都不涉及 ADT,因此很难在我的脑海中转换它并且仍然围绕它。我的(诚然不完整的)OLL 代码及其随附的迭代器:

import java.util.Iterator;

public class OrderedLinkedList<E extends Comparable<E>> implements Iterable<E> 
{
    private E first;
    private E next;
    private E last;
    private E current;
    private E temp;
    private int size;

    public OrderedLinkedList() 
    {
        this.first = null;
        this.next = null;
        this.last = null;
        this.current = null;
        this.size = 0;
    }

    public E findOrAdd(E element)
    {
        E returnVal = null;
        Iterator<E> listIter = this.iterator();

        if (this.first == null)
        {
            this.first = element;
            this.size++;
        }

        else 
            for (int i = 0; i < this.size; i++)
                {
                    if (listIter.next().compareTo(element) == 1 && listIter.hasNext() == false)
                    {
                        temp = this.first;
                        this.first = element;
                        this.next = temp;
                        this.size++;
                    }   
                    else if (listIter.next().compareTo(element) == 1 && listIter.hasNext() == true)
                        continue;
                    else if (listIter.next().compareTo(element) == 0)
                        returnVal = element;
                    else if (listIter.next().compareTo(element) == -1)
                    {
                        temp = this.next;
                        this.next = element;                        
                    }               
                }

        return returnVal;
    }

    public Iterator<E> iterator()
    {
        return new OrdListIterator<E>();
    }

    private class OrdListIterator<E> implements Iterator<E> 
    {
        private E nextNode;

        public OrdListIterator()
        {
            //maybe something needed here
        }

        public boolean hasNext()
        {
            return (next != null);
        }

        public E next()
        {       
            return (E) next;
        }

        public E first()
        {
            return (E) first;
        }

        public void remove()
        {
            //implement later
        }
    }
}

我在 StateCity 类中有 compareTo() 方法,它们覆盖了通常的方法,但仍然以相同的方式工作。 findOrAdd 哪里出错了? 怎么我错了?我不是在寻找对代码或任何东西的全面更正;我大约 99% 确定 else 块下的所有内容都很糟糕。我只需要朝着正确的方向前进:在某个地方站稳脚跟。我非常感谢任何建议。

【问题讨论】:

    标签: java linked-list add


    【解决方案1】:

    我相信您的问题可能在于您为每个条件调用listIter.next() 这可能意味着您在每次检查时都在推动迭代器。可能您应该将其存储在循环的开头,然后在比较中使用单个对象...

    【讨论】:

    • 哦,这很好。我还没有完全达到使用提供的测试代码的地步,所以我不确定这是否会成为问题,但它绝对不适合我。谢谢。
    • 欢迎。这是否解决了您遇到的问题,或者您正在寻找进一步的问题?
    • 所以根据你的建议来看它(我在循环顶部添加了一个E current = listIter.next(); 声明),我实际上需要切换 -1 和 1 ifs 的作用,对?因此,如果参数出现在 current 之后,循环会在另一个 listIter.next() 调用之后继续,但如果参数出现在 current 之前,那么它会插入到那里并且节点标记会相应地移动。
    • 是的,据我所知,我相信这是正确的。您的第一个if 语句,如果它小于当current.compareTo(element) 返回负数时出现的第一个节点。另外,我发现有帮助的是,而不是使用 current.compareTo(element) == 1 使用 current.compareTo(element) &gt; 0 仅仅是因为 Comparable 接口的合同 [docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html] 因为它只要求它进一步是积极的,它可以更容易阅读,current.compareTo(element)&gt;0读取当前>元素
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    相关资源
    最近更新 更多