我试图将Index元素移动到单个列表的末尾,同时移动所有其他元素,如果我有一个{1,2,3,4,5}的列表并且我将索引2传递给它,它将返回{1,2,4,5,3}。
public void moveToLast(int index) throws IllegalArgumentException {
if(index<0 || index > size())
throw new IllegalArgumentException("" + index);
Node ref= first;
Node otherRef=first;
for(int i=0;i<index;i++){
ref=ref.next;
for(int j=0;j<size()-1;j++){
if(otherRef.next!=null)
otherRef=otherRef.next;
}
}
E temp=ref.data;
ref.data=otherRef.data;
otherRef.data=temp;
}
我编写的这段代码只在index和最后一个元素处切换元素,返回{1,2,5,4,3}
感谢您的帮助并牢记,我对编码非常陌生,非常感谢所有帮助。
答案 0 :(得分:1)
您必须在循环时更新引用,而不是在结束时。
这是一个小算法,可以为您节省双循环。我实现了交换引用,而不是data
,但结果没有实际差异。我不确定你对一种方法或另一种方法有什么限制,但是如果你有删除节点的方法等等,你通常使用引用而不是值。
我没有编译它,所以请原谅任何错误,但我认为这样的事情应该有效:
public void moveToLast(int index) throws IllegalArgumentException {
if(index<0 || index > size())
throw new IllegalArgumentException("" + index);
Node refToMove= first;
Node previousRef=null;
for(int i=0;i<index && refToMove!=null;i++){
previousRef=refToMove;
refToMove=refToMove.next;
}
if(refToMove!=null && previousRef!=null) {
Node nextRef=refToMove.next;
while(nextRef!=null) {
previousRef.next = nextRef;
Node tempRef = nextRef.next;
nextRef.next = refToMove;
refToMove.next = tempRef;
nextRef = tempRef;
}
}
}
答案 1 :(得分:0)
也考虑一下。
if(index<0 || index > size())
没有捕获所有坏索引。如果不允许index == size
超出界限,并且如果索引是最后一个元素,那么你应该返回,因为不需要做任何事情,也许改为
if(index<0 || index >= size())
//throw exception
if( index == (size()-1))
return
就像你说你的代码只在你找到索引元素的最后一个元素时交换,并在结尾处分配它们。
你需要做的是找到第一个然后为每个集合指向下一个元素的链接,直到结束然后你设置最后一个元素来链接原始索引,如此
public void moveToLast(int index) throws IllegalArgumentException {
if(index<0 || index >= size())
throw new IllegalArgumentException("" + index);
if( index == (size()-1))
return
Node currentElement = first;
Node elementToMove;
Node nextElement;
// if first is the one to move
if(index == 0)
{
elementToMove = first;
currentElement = first.next;
first = currentElement
}
// Iterate over the list only once
for(int i = 0; i < size()-2; i++) // up to the 2nd to last element as the next element is referenced
{
nextElement = currentElement.next
if(i+1 == index) // next element is the one you want to move
{
// store reference to the element you want to move
elementToMove = nextElement;
// Skip this element and update to the next one
nextElement = nextElement.next;
}
// Update reference
currentElement.next = nextElement;
// Move to next element
currentElement = nextElement
}
// Put the one to move on the end
currentElement.next = elementToMove
}
这可以节省你在列表上循环两次,我没有检查或编译这个,所以你可能还需要在这里添加空检查,如果输入的索引是0,你还需要特别考虑,即你需要重置first