Java循环链表,删除无法正常工作的节点

标签 java adt nodes circular-list

好吧,所以我需要从循环列表中删除项目,作为一个无法正常工作的更大程序的一部分,而且我似乎无法删除传入删除方法的最后一个节点,如果传入的索引是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;

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

解决此问题的一个稍微好一点的方法可能是使用要删除的节点作为参数,而不是其索引。这样您就可以避免跟踪数据结构内的索引。 例如

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.data.equals(),而不是比较 if(temp == n) n.数据)).equals() 方法的使用专门针对 String 类型,但您可以修改它以使用您期望的任何数据类型,或者更好地编写一个自定义 .equals 方法,允许对抽象数据类型使用泛型。

关于Java循环链表,删除无法正常工作的节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33400155/

相关文章:

java - 如何使用分割字符串搜索并填充到 ListView

java - 无法在更新的 adt 上引用库项目 android

javascript - d3.js 树节点布局删除根节点

mysql - 直接从数据库删除节点

android - Eclipse ADT bundle 链接在哪里?

java - LinkedList的实现方式,Java

java - 如何定位如图所示的元素

java - 二维(并发)HashMap : 2-property key type? hashmap of hashmaps? [更新]

java - 访问图像的像素

java - 将Android源码导入ADT(Eclipse)报错