我正在阅读有关循环链接列表的内容。这是一个我不明白它是如何工作的代码。
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/
我在第二段代码中做得对吗?
由于
答案 0 :(得分:1)
示例代码使用基于1的索引:1,2,3,...,size。这在计算机科学中很奇怪,人们会期望:0,..,size-1。
不幸的是size
是整个列表的属性,而不是列表中的单个节点。所以他们的解决方案很好。
虽然当索引< = 0时会发生好事。
对于真正的循环列表,节点具有previous
字段。最后一个节点通过两种方式链接到第一个节点。
在这种情况下,您可以按照next
或previous
向两个方向行走。
然后当索引< size / 2 one next
转发到索引,或者返回previous
for about(size-index)步骤。为了采取最少的步骤。
答案 1 :(得分: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;
}
第一个代码也在计算,但它不是使用另一个变量,而是使用现有的
答案 2 :(得分:0)
您不理解的行只是计算"索引"位置是向前的,它从头开始。所以这个方法会让你回到元素" index -1"头部元素的位置 其他假设是头元素为1