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

I am trying to create a circular LinkedList Please tell me if its a correct way to do it

我已经实现了逻辑,比如如果我给出一个还不存在的索引,那么它会将索引更改为提醒(我猜与旋转相同)。

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++;
    }
}

我能看到的几点:

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

你很接近。

(1) 众所周知,术语“circular linked list”表示尾部链接回头部的列表(反之亦然,如果它是双向链表)。你的更像是一个存储在链表中的 "circular buffer"。我们可以称它为 LinkedListCircularBuffer 或其他名称。

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

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) 总是 在每个 "then" 和 "else" 子句周围放置大括号是一种很好的风格。代码如

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

易碎,例如在 "then" 子句中添加 println() 语句会破坏它。

我发现您的代码存在一些问题:如果 count ==0 并且如果我使用方法 add(7,obj) ,则 7%0 将抛出 ArithmeticException.count 应该声明为私有,因为您可能你的 class.Also 有两个实例,你需要检查 poll\offerLast 方法是否满足您的需求,因为您不能限制 避免使用 them.Finally、clone\readObject\writeObject 的任何客户端代码 需要覆盖以包含计数变量。