为LinkedList编写subList方法

时间:2016-06-27 18:16:42

标签: java generics linked-list sublist

作为赋值的一部分,我正在编写一个带有虚拟头节点的单链,非圆形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中的节点

1 个答案:

答案 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]

虽然我还在学习,而且我的代码可能并不理想,但希望此回复可以帮助其他人解决同样的问题!