Java 与导航LinkedList或跟踪LL中以前的元素相混淆
我正在努力实现LinkedList,这对我来说是一个全新的课题。 在处理不同类型的LinkedList问题时,我遇到了一个常规错误,即遍历LinkedList以跟踪前面的元素。 有些老式的穿越方式是 列表L=L下一步 问题来了。 就像我想跳过列表中的一些元素,然后删除下一组元素,然后再次跳过问题。 为了做到这一点,我想遍历LL直到跳过,现在遍历引导我思考L=L。下一步,我再次陷入递归 请给我解释一下这个问题的特点以及如何处理这种情况。 请把它看作是我理解中的一个笨蛋,因此我不能再往前走了,只需要一点光线就可以解决这个问题。 我是非常新的这种执行 我的链接列表-Java 与导航LinkedList或跟踪LL中以前的元素相混淆,java,algorithm,data-structures,linked-list,Java,Algorithm,Data Structures,Linked List,我正在努力实现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()
分别计算是要跳过还是删除元素。如果逻辑涉及对序列求值,则可能需要保持某些状态
这种方法使用迭代遍历(而不是递归),我认为这更适合这个问题如果您在调试器中单步遍历代码,您应该能够看到为什么会有无休止的递归。简言之如果代码中有错误,请先尝试调试器。