作为赋值的一部分,我正在编写一个带有虚拟头节点的单链,非圆形LinkedList,同时实现泛型。赋值需要实现List接口,但是我坚持使用subList方法。我一直在搜索StackOverflow以及网络,试图看看它是如何完成的一个例子,因为我已经尝试了我自己设计的几种不同的方法,但是subList中的更改没有反映到原始的LinkedList。我重写了我的方法,尝试并遵循最高回答here的结构(在某种程度上,我不需要任何帮助方法),这是我的结果代码:
@Override
public List<E> subList(final int fromIndex, final int toIndex){//FIX ME
if(fromIndex < 0 || fromIndex > this.size()-1 || toIndex < 0 || toIndex > this.size()-1){
throw new IndexOutOfBoundsException("Index out of bounds on call to subList with fromIndex of"
+ fromIndex + " and toIndex of" + toIndex);
}
List<E> list = new LinkedList<E>();
Node<E> cur = this.head.next;
int count = 0;
while(cur!=null){
if(count >= fromIndex && count < toIndex){
list.add(cur.data);
}
cur = cur.next;
count++;
}
return list;
}// end sublist
以下是我的测试人员文件的片段,您可以看到我使用正确的节点创建了一个子列表,但是在子列表中所做的更改没有反映在原始的LinkedList中,我不知道如何继续修复的是:
New LinkedList has been created
List before testing: [one, two, three, four, five]
Testing subList function with fromIndex of 1, and toIndex of 4
Printing subList: [two, three, four]
Changing data of sublist to 'six, seven, eight'
Printing subList: [six, seven, eight]
Printing LinkedList after test: [one, two, three, four, five]
我不确定使用LinkedList是因为我的subList是正确的选择,任何建议或批评都会受到极大的赞赏!
编辑:在下面回答了我自己的问题,我本质上是创建新节点,而不是直接指向原始LinkedList中的节点
答案 0 :(得分:0)
我将回答我自己的问题,希望这对任何想要在未来重新审视的人都有用。
所以在我的代码中我使用了LinkedList中的add(int index,E data)函数,我编写它的方式创建了一个新的Node并将其插入到列表中,而不仅仅是更改数据变量本身。所以我重写了它,所以它不再创建新的节点,然后我将上面的subList类改为:
public List<E> subList(final int fromIndex, final int toIndex){//FIX ME
if(fromIndex < 0 || fromIndex > this.size()-1 || toIndex < 0 || toIndex > this.size()-1){
throw new IndexOutOfBoundsException("Index out of bounds on call to subList with fromIndex of" + fromIndex + " and toIndex of" + toIndex);
}
LinkedList<E> list = new LinkedList<E>();
Node<E> cur = this.head.next;
Node<E> pointer = list.head;
int count = 0;
while(cur!=null){
if(count >= fromIndex && count < toIndex){
pointer.next = cur;
list.size++;
pointer = pointer.next;
}
cur = cur.next;
count++;
}
return list;
现在不是使用add函数,而是直接将原始LinkedList中的Node分配给subList中的Node,并手动增加大小。
不幸的是因为每个Node都有一个下一个引用,即使我正确地手动添加它们,当我的toString函数被调用时,它会一直遍历LinkedList,包括经过我的'toIndex'的节点,直到下一个节点是空值。为了解决这个问题,我在包含大小的toString中添加了一个附加条件,并且还更改了我的if语句,用于向返回的String添加逗号:
public String toString(){
String ret = "[";
Node cur= this.head.next;
int index = 0;
while(cur != null && index < size){// added the index < size condition
ret = ret + cur.data;
if(index < this.size -1){// changed from cur.next != null
ret = ret + ", ";
}
cur = cur.next;
index++;
}
ret = ret + "]";
return ret;
}// end toString
最后,我的测试输出如下所示:
Testing subList function with fromIndex of 1, and toIndex of 4
Printing subList: [two, three, four]
Changing data of sublist to 'six, seven, eight'
Printing subList: [six, seven, eight]
Printing LinkedList after test: [one, six, seven, eight, five]
虽然我还在学习,而且我的代码可能并不理想,但希望此回复可以帮助其他人解决同样的问题!