2016-08-03 76 views
0

我在閱讀有關循環鏈表的內容。這是一個代碼,我不明白它是如何工作的。元素在循環鏈表中的索引

public int elementAt(int index){ 
     if(index>size){ 
      return -1; 
     } 
     Node n = head; 
     while(index-1!=0){ // this line is unclear for me 
      n=n.next; 
      index--; 
     } 
     return n.data; 
    } 

我會寫同樣的代碼,但以這樣的方式

public int elementAt(int index){ 
     if(index>size){ 
      return -1; 
     } 
     Node n = head; 
     while(n.size != index){ // here is my change in the code 
      n=n.next; 
     } 
     return n.data; 
    } 

這裏是整個代碼:http://algorithms.tutorialhorizon.com/circular-linked-list-complete-implementation/

我在第二個代碼權做什麼?

謝謝

+1

爲什麼不自己檢查/使用調試器? – Idos

+0

'n.size'會是什麼? – Thomas

+0

這裏是整個代碼http://algorithms.tutorialhorizo​​n.com/circular-linked-list-complete-implementation/謝謝 – Joe

回答

0

它只是在做一個計數。你可以用各種方法做到這一點。我假設這個大小是你的LinkedList的大小。在這種情況下,你的代碼是錯誤的。你可以像以下

public int elementAt(int index){ 
     if(index>size){ 
      return -1; 
     } 
     Node n = head; 
     int i = 0; // zero-indexing 
     while(i++ != index){ // you can increment i at the end too 
      n=n.next; 
     } 
     return n.data; 
    } 

第一代碼也計數但是,代替使用它使用了現有的一個

+0

非常感謝,我明白,上帝保佑你:) – Joe

1

示例代碼使用基於1的索引另一個變量:1,2,3,。 ..,尺寸。這在計算機科學中很奇怪,人們可能會期望:0,..,size-1。

不幸的是size是整個列表的屬性,而不是列表中的單個節點。所以他們的解決方案很好。

雖然當索引< = 0,那麼好事發生。


對於一個真正的圓形列表中的節點具有previous場。最後一個節點連接到第一個節點。

在這種情況下,您可以沿着兩個方向走,在nextprevious之後。 然後,索引<大小/ 2將由next轉發到索引,否則返回previous大約(大小 - 索引)步驟​​。爲了採取最少的步驟。

+0

確實是「好東西」;) – Thomas

0

你不明白的那一行只是指向「索引」的位置,它是從頭開始的。因此,該方法將頭元素 中的元素「index -1」返回給您。其他假設是頭元素位於1