我正在尝试创建一个循环链接列表请告诉我它是否是正确的方法

时间:2015-02-24 05:46:11

标签: java data-structures linked-list circular-list

我已经实现了逻辑,如果我给的索引还没有那么它会将索引更改为提醒(就像我想的那样旋转)。

import java.util.LinkedList;

public class MycircularlinkedList extends LinkedList {

    private static int count = 0;

    public Object get(int i) {
        System.out.println("count==" + count);
        if (i > count) {
            i = i % count;
            return super.get(i);

        } else {
            return super.get(i);
        }

    }

    public boolean add(Object o) {

        super.add(o);
        count++;
        return true;
    }

    public void add(int i, Object o) {
        if (i > count)
            i = i % count;
        super.add(i, o);
        count++;
    }
}

3 个答案:

答案 0 :(得分:1)

我可以看到几点:

  1. count是静态的,这意味着您只会在这里拥有一个号码。可能不是你想要的东西
  2. count是多余的,请使用Collection#size()
  3. 关于mod(%)的好处是它适用于所有数字,你不需要有条件。 2 % 12 == 14 % 12 == -10 % 12
  4. 如果您正在摆脱count属性,则可以摆脱被覆盖的#add(Object o)逻辑并执行return super.add(o);

答案 1 :(得分:1)

我发现你的代码存在一些问题:如果count == 0并且我使用方法add(7,obj),那么7%0会抛出ArithmeticException.count应该声明为private,因为你可能有两个实例你的班级。还需要检查 poll \ offerLast方法是否满足您的需求,因为您无法限制 任何客户端代码都要避免使用它们。最后,克隆\ readObject \ writeObject 需要被夸大以包括计数变量。

答案 2 :(得分:0)

你关闭了。

(1)术语" circular linked list"众所周知,尾部链接到头部的列表(反之亦然,如果它是双向链表)。你的更像是一个循环缓冲区"存储在链表中。我们可以称之为LinkedListCircularBuffer或其他东西。

(2)该类应该由元素类型参数化,因此

public class LinkedListCircularBuffer<E> extends LinkedList<E> {
  @Override
  public E get(int i) {
    return super.get(i % size()); // simpler and faster without an "if"
  }
}

(3)您可以拨打size()而不是所有代码来维护另一个count

(4)您的add(int i, Object o)方法并不支持i == size()的情况,但您可以通过不覆盖add()来解决这个问题。

(5)重写方法需要@Override注释。

(6)始终在每个&#34;然后&#34;周围放置大括号的好风格和&#34;否则&#34;条款。代码如

if (i > count)
  i = i % count;

很脆弱,例如在{&#34;然后&#34;中添加println()语句条款将打破它。