Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与导航LinkedList或跟踪LL中以前的元素相混淆_Java_Algorithm_Data Structures_Linked List - Fatal编程技术网

Java 与导航LinkedList或跟踪LL中以前的元素相混淆

Java 与导航LinkedList或跟踪LL中以前的元素相混淆,java,algorithm,data-structures,linked-list,Java,Algorithm,Data Structures,Linked List,我正在努力实现LinkedList,这对我来说是一个全新的课题。 在处理不同类型的LinkedList问题时,我遇到了一个常规错误,即遍历LinkedList以跟踪前面的元素。 有些老式的穿越方式是 列表L=L下一步 问题来了。 就像我想跳过列表中的一些元素,然后删除下一组元素,然后再次跳过问题。 为了做到这一点,我想遍历LL直到跳过,现在遍历引导我思考L=L。下一步,我再次陷入递归 请给我解释一下这个问题的特点以及如何处理这种情况。 请把它看作是我理解中的一个笨蛋,因此我不能再往前走了,只需要

我正在努力实现LinkedList,这对我来说是一个全新的课题。 在处理不同类型的LinkedList问题时,我遇到了一个常规错误,即遍历LinkedList以跟踪前面的元素。 有些老式的穿越方式是

列表L=L下一步

问题来了。 就像我想跳过列表中的一些元素,然后删除下一组元素,然后再次跳过问题。 为了做到这一点,我想遍历LL直到跳过,现在遍历引导我思考L=L。下一步,我再次陷入递归

请给我解释一下这个问题的特点以及如何处理这种情况。 请把它看作是我理解中的一个笨蛋,因此我不能再往前走了,只需要一点光线就可以解决这个问题。 我是非常新的这种执行

我的链接列表-

        MyList list_Sort = new MyList(9);
        list_Sort.next = new MyList(8);
        list_Sort.next.next = new MyList(8);
        list_Sort.next.next.next = new MyList(7);
        list_Sort.next.next.next.next = new MyList(5);
        list_Sort.next.next.next.next.next = new MyList(4);
        list_Sort.next.next.next.next.next.next = new MyList(6);
        list_Sort.next.next.next.next.next.next.next = new MyList(3);
        list_Sort.next.next.next.next.next.next.next.next = new MyList(1);
        list_Sort.next.next.next.next.next.next.next.next.next = new MyList(2);

9-->8-->8-->7-->5-->4-->6-->3-->1-->2-->TAIL

哇!!这当然不是遍历
链接列表的方法。如果有
10000
节点,则无法写入
。下一步
9999
次:-)

尽量不要使用递归,因为你对此不确定。循环更易于使用。使用循环:

while(current.next != null)
{
    //do your stuff
    current = current.next;
}
如果我没记错的话,你曾经问过如何对0和1进行排序。你做了和你在那里做的一样的事。使用指针跟踪节点。只需遍历到要删除的节点之前的节点(使用
current
指针)。然后在那里放置一个指针作为参考。然后继续遍历(使用
present
指针)直到要删除的节点。现在只需在前面再跳一次,这样您就可以精确地指向要删除的节点的下一个节点。现在做:

current.next = present;

沃拉!!完成后

您可以通过以下逻辑遍历到不想跳过的第一个元素

List tmp = L;
while (tmp != null && doSkip(tmp.data)) {
  tmp = tmp.next;
}
然后转到不想删除的第一个元素:

List tmp2 = tmp;
while (tmp2 != null && doDelete(tmp2.data)) {
  tmp2 = tmp2.next;
}
然后通过将下一个从
tmp
链接到第一个不删除元素,删除
tmp
tmp2
之间的元素:

tmp.next = tmp2;
这里
doSkip()
doDelete()
分别计算是要跳过还是删除元素。如果逻辑涉及对序列求值,则可能需要保持某些状态


这种方法使用迭代遍历(而不是递归),我认为这更适合这个问题

如果您在调试器中单步遍历代码,您应该能够看到为什么会有无休止的递归。简言之如果代码中有错误,请先尝试调试器。