【问题标题】:Delete duplicate value in linked list (Recursion in Java)删除链表中的重复值(Java 中的递归)
【发布时间】:2016-11-23 07:55:02
【问题描述】:

我需要返回链表的头部,删除所有重复的元素。我理解问题的逻辑,但我对使用递归感到困惑。

/*
Node is defined as 
class Node {
   int data;
   Node next;
}
*/

Node RemoveDuplicates(Node head) {
    if ((head == null) || (head.next == null))
        return head;
    else {
        RemoveDuplicates(head.next);
        if (head.data==head.next.data) head.next = head.next.next;  
    }
    return head;
}

如果我在 if 条件之前调用函数 RemoveDuplicates(head.next);它工作正常。但是,如果我交换语句的顺序(其余一切都完全相同),例如:

if (head.data==head.next.data) head.next = head.next.next;
RemoveDuplicates(head.next);

代码无法正确解决像“1->1->1->1”这样的测试用例。我在后一种情况下得到的输出是'1->1'。

我真的想要一些关于如何更好地理解递归的建议。

【问题讨论】:

标签: java recursion linked-list


【解决方案1】:

首先,您的代码仅在列表有序时才解决,如果数据位于随机位置,则无法删除所有重复节点,例如:1, 2, 3, 1, 1, 2, 3

其次,为了你的关心,你可以这样想:

案例一:

 RemoveDuplicates(head.next);
 if (head.data==head.next.data) head.next = head.next.next;  

你检查列表末尾之前的元素,比较它的数据和下一个数据,如果匹配,用下一个下一个节点替换下一个节点。然后,跳转到上一个节点并重复。

案例 2:

if (head.data==head.next.data) head.next = head.next.next; 
RemoveDuplicates(head.next);

您从第一个节点开始,检查它是否与下一个节点重复。如果重复,请用第 3 个节点替换第 2 个节点。 ,跳转到下一个节点(现在是原来的第 3 个节点),检查它是否重复到下一个节点。你看,你错过了检查第一个节点和原来的第三个节点。

我认为您应该尝试模式调试以深入了解这一点。

顺便说一句,尝试将约定应用于您的代码。 Ĵ 希望对您有所帮助!

【讨论】:

    【解决方案2】:

    问题是你在后一种情况下“跳过”了一些节点。 让我们为示例中的节点命名,看看发生了什么:

    v
    1 -> 1 -> 1 -> 1
    a    b    c    d
    

    v 表示您方法中head 的当前引用。

    如果您现在先进行检查,则比较ab,然后删除b

    v
    1 -> 1 -> 1
    a    c    d
    

    然后你做一个递归步骤,向前移动一个节点到c

    问题是你在后一种情况下“跳过”了一些节点。 让我们为示例中的节点命名,看看发生了什么:

    v
    1 -> 1 -> 1 -> 1
    a    b    c    d
    

    v 表示您方法中head 的当前引用。

    如果您现在先进行检查,则比较ab,然后删除b

         v
    1 -> 1 -> 1
    a    c    d
    

    这是你的问题。您从未将c 与其左侧的值进行比较,即a/cb/c

    切换线路时不会出现此问题,因为那样你走的是另一种方式,即你自下而上(从右到左)浏览你的列表并且只比较/删除到右边(“在你身后" 在步行方向)。

    【讨论】:

      猜你喜欢
      • 2017-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-20
      • 2012-11-06
      • 2014-05-02
      相关资源
      最近更新 更多