好的,所以我需要从循环列表中删除项目,这是一个较大的程序的一部分,该程序无法正常工作,而且我似乎无法删除传入删除方法的最后一个节点,如果传入的索引为1,它将删除第一个节点列表中的节点并替换它,但是当此时仅剩一个节点时,没有什么可引用的。我将在此处保留删除方法

 public void delete(int index)
 {
     if(Node.numOfUsers == 1)
     {
         first=null;
         return;
     }

     //make curr the same as first node
     int i = 1;
     curr=first;
     //if index passed in is 1, make temporary node same as one after first node
//   if(size<1)
    // {

        // System.out.println("ok so this is where we are at");
    // }
     if(index==1)
     {
         temp=first.nextNode;

         while(temp.nextNode!=first)
         {
             temp=temp.nextNode;
         }

         temp.nextNode=temp.nextNode.nextNode;
         first=curr.nextNode;
     }
     else
     {
         //as long as i is not equal to node index-1 move current on 1 and increment i by 1
         while(i != index-1)
         {
             curr=curr.nextNode;
             i++;
         }
         //curr.nextNode is pointing to the node index we want and making it equal to one index above it
         curr.nextNode=curr.nextNode.nextNode;
     }
     Node.numOfUsers--;
     int size=size();


 }


}

最佳答案

看起来您正在全局跟踪许多用户。如果它的行为符合我的预期,则可以在此方法的开头进行一次小检查,以便在该方法为零的情况下不会遵循其后的任何逻辑。

if(Node.numOfUsers == 0) return;


这将使您不必再执行任何其他逻辑。

解决此问题的更好方法是将要删除的Node用作参数,而不是其索引。这样,您可以避免必须跟踪数据结构内的索引。
例如

public void delete(Node n) {
    if(Node.numOfUsers == 0 || n == null) return; // 0 nodes or null parameter.

    Node temp = first;

    if(temp.next == null) { //only one node
        temp = null; //simply delete it
    } else {
        while(temp.next != n) {
            temp = temp.next;
            if(temp == first) { //if we circle the entire list and don't find n, it doesn't  exist.
                return;
            }
        }
        temp.next = n.next; // perform the switch, deleting n
    }
}


编辑:上面的代码遵循以下假设,即您将具有对要删除的节点的引用。如果不是这种情况,那么使用索引也一样。您也可以考虑比较值,但是这将要求您假设节点中具有唯一值(并且我不知道您的限制是什么)。

比较值的逻辑与上述相同,但是例如,您可以比较if(temp == n)而不是比较if(temp.data.equals(n.data)).equals()方法的使用专门用于String类型,但是您可以对其进行修改以使其与所需的任何数据类型一起使用,或者更好地编写一个自定义的.equals方法,该方法允许将泛型用于您的抽象数据类型。

09-04 07:49
查看更多