0

我正在努力实现 LinkedList 及其对我来说非常新的主题。在处理不同类型的 LinkedList 问题时,我遇到了遍历 LinkedList 以跟踪先前元素的一般错误。一些老式的遍历方式是

列表 L = L.next

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

请向我解释一下这个问题以及如何处理这种情况。请在我的理解中将其视为一个笨蛋,因此我无法进一步前进,只需一点点光就会引导我对问题进行分类。

我很新这种实现

我的链表-

        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
4

2 回答 2

0

哇!!这当然不是遍历 a 的方式LinkList。如果你有10000节点你不能写.next 9999时间:-)

如果您不确定,请尽量不要使用递归。循环更容易使用。使用循环:

while(current.next != null)
{
    //do your stuff
    current = current.next;
}

如果我没记错的话,你曾经问过如何排序0s and 1s。你在那儿做同样的事情。您使用指针来跟踪您的节点。只需遍历要删除的节点之前的那个节点(使用current指针)。然后在此处放置一个指针以供参考。然后继续遍历(使用present指针)直到要删除的节点。现在只需在前面再跳一跳,这样您就可以准确地指向要删除的节点的下一个节点。现在做:

current.next = present;

沃拉!!完成

于 2012-04-30T19:12:23.177 回答
0

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

List tmp = L;
while (tmp != null && doSkip(tmp.data)) {
  tmp = tmp.next;
}

然后转到您不想删除的第一个元素:

List tmp2 = tmp;
while (tmp2 != null && doDelete(tmp2.data)) {
  tmp2 = tmp2.next;
}

然后通过将下一个 from 链接到第一个 no-delete 元素来删除 和 之间的元素tmptmp2tmp

tmp.next = tmp2;

在这里doSkip()doDelete()分别评估您是要跳过还是删除元素。如果逻辑涉及评估序列,您可能需要保留一些状态。

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

于 2012-04-30T19:12:43.667 回答