2014-10-18 78 views
0

我正在创建一个实现Iterable.I的自定义链表,它试图从迭代器的remove方法中调用我包含的类方法remove方法,但我无法这么做。它说:“The 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()并且不能直接调用此方法?

回答

2

访问外实例的方法正确的语法是:

@Override 
public void remove() { 
    LinkedList.this.remove(position); 
} 

编译器 - 虽然 - 为那些有明确的方法的简便方法。这意味着,您必须使用上述语法,因为具有相同名称的方法(remove)在匿名类中声明。另一方面 - 例如 - 您可以直接拨打next方法中的get

+0

但为什么我能够直接调用外部类的removefromEnd()? – 2014-10-18 15:56:59

+0

我编辑了我的答案。 – Seelenvirtuose 2014-10-18 15:59:50

+0

但编译器不应该根据参数的类型或名称区分函数吗? – 2014-10-18 16:06:31