当前位置: 首页 > 知识库问答 >
问题:

删除链表中的重复值(Java中的递归)

闾丘康安
2023-03-14

我需要返回带有删除的所有重复元素的链表的头部。我理解这个问题的逻辑,但我在使用递归时变得困惑。

/*
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);很好用。但是,如果我交换语句的顺序(rest所有内容都完全相同),如下所示:

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

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

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

共有1个答案

东郭勇
2023-03-14

首先,您的代码只解决列表是否有序的问题,如果数据处于随机位置,则无法删除所有重复的节点,例如:1,2,3,1,1,2,3

其次,对于您的关注,您可以如下所示:

案例1:

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

顺便说一句,尝试将约定应用到代码中。希望这能帮上忙!

 类似资料:
  • 问题内容: 我想从排序的链表{0 1 2 2 3 3 4 5}中删除重复项。 ` ` prev.setNext(tempHeader)在while循环内无法正常工作。理想情况下,当prev = 2且tempHeader = 3时,prev.next应该是data = 3的节点。 Printlist函数仅使用标题指针并打印列表。 节点定义如下。 问题答案: 循环已排序,因此您知道重复项将彼此相邻。如

  • 我正在学习数据结构,并试图理解Java中的链接列表。我的问题是,我有麻烦与删除节点在给定的索引递归。我的目标是得到O(log n),而不是使用循环,最后得到O(n)。 因此,当我试图删除索引2的条目时,它会删除该索引之前的所有数字,但不会删除该索引-因此它会删除[0]和[1],但不会删除[2]。 例如,在此代码中,删除前的数组填充为:。调用后,它有以下条目: 我只想删除13,这样数组就会像这样:

  • 我试图从排序的单链表中删除重复的值。 这是我的密码 SinglelyLinkedListNode*移除的副本(SinglelyLinkedListNode*头){ } 然而,当单向链表为3-时,代码失败

  • NowCoder 题目描述 解题描述 // java public ListNode deleteDuplication(ListNode pHead) { if (pHead == null || pHead.next == null) return pHead; ListNode next = pHead.next; if (pHead.val == n

  • 一、题目 在一个排序的链表中,如何删除重复的结点? 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5 二、解题思路 解决这个问题的第一步是确定删除的参数。当然这个函数需要输入待删除链表的头结点。头结点可能与后面的结点重复,也就是说头结点也可能被删除,所以在链表头添加一个结点。 接下来我们从头遍历整个链表。如果当前结点的值与下一个结点的值相同,那么它们就是重复的结点,都可以

  • 结果:[1,2,3,3,3,4,4][1,2,3,3,3,4,4]