如何在转移所有其他元素java时将Index元素移动到Singly List的末尾

时间:2013-06-20 23:14:11

标签: java singly-linked-list

我试图将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}

感谢您的帮助并牢记,我对编码非常陌生,非常感谢所有帮助。

2 个答案:

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