2014-10-18 79 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