我正在创建一个实现Iterable的自定义链接列表。我试图从迭代器的remove方法调用我的包含类方法remove方法,但我不能这样做。它说“类型中的方法remove()是不适用于参数(int)“
这是我的代码:
package collections.customCollections.linkedList;
import java.util.Iterator;
public class LinkedList<T> implements Iterable<T>{
private Link<T> head;
private Link<T> tail;
private int size;
public int getSize() {
return size;
}
public LinkedList(){
head = null;
tail = null;
size=0;
}
public void addAtEnd(T data){
Link<T> newNode = new Link<T>(data);
//Insert as first element
if(head == null){
head = newNode;
tail = newNode;
}
else{
newNode.previous = tail;
tail.next = newNode;
tail = newNode;
}
size++;
}
public void addAtStart(T data){
Link<T> newNode = new Link<T>(data);
if(head == null){
head = newNode;
tail = newNode;
}
else{
newNode.next = head;
head.previous = newNode;
head=newNode;
}
size++;
}
//prints the entire linked list
public void print(){
Link<T> traversalNode = head;
if(head == null){
System.out.println("Empty Linked List");
}
else{
while(traversalNode != null){
System.out.print(traversalNode.data +"->");
traversalNode=traversalNode.next;
}
}
}
public T remove(int index){
int i=1;
Link<T> traversalNode = head;
while(i<index){
traversalNode=traversalNode.next;
i++;
}
if(traversalNode.next==null){
removefromEnd();
}
else if(traversalNode.previous==null){
removeFromStart();
}
else{
traversalNode.previous.next=traversalNode.next;
traversalNode.next.previous=traversalNode.previous;
traversalNode.next=null;
traversalNode.previous=null;
}
return traversalNode.data;
}
public T removefromEnd(){
Link<T> nodeToRemove = tail;
tail = nodeToRemove.previous;
tail.next = null;
size--;
return nodeToRemove.data;
}
public T removeFromStart(){
Link<T> nodeToRemove = head;
head = nodeToRemove.next;
head.previous = null;
size--;
return nodeToRemove.data;
}
public T get(int index)
{ Link<T> returnedNode = head;
int i = 1;
while(i < index){
returnedNode=returnedNode.next;
i++;
}
return returnedNode.data;
}
private class Link<T>{
private T data;
private Link<T> next = null;
private Link<T> previous = null;
public Link(T data){
this.data = data;
}
}
@Override
public Iterator<T> iterator() {
return new Iterator<T>(){
private int position;
@Override
public boolean hasNext() {
if(position<getSize()){
return true;
}
return false;
}
@Override
public T next() {
T data=get(position);
position++;
return data;
}
@Override
public void remove() {
remove(position);
}
};
}
}
编辑:我知道我可以使用LinkedList.this.remove()调用该方法。我更感兴趣的是知道为什么我可以直接调用removefromEnd()并且不能直接调用这个方法?
答案 0 :(得分:2)
访问外部实例方法的正确语法是:
@Override
public void remove() {
LinkedList.this.remove(position);
}
编译器 - 虽然 - 为明确的方法提供了一种便捷的方法。这意味着,您必须使用上述语法,因为在匿名类中声明了具有相同名称(remove)的方法。另一方面 - 例如 - 您可以直接在get
方法中调用next
。