跳到主要内容

简述Java实现无序链表删除重复节点 ?

参考答案:

无序链表删除重复节点的问题可以使用哈希表(HashSet)来解决。以下是使用Java语言实现该问题的基本步骤:

  1. 遍历链表,将每个节点的值添加到HashSet中。如果添加失败(即HashSet中已经存在该值),说明这是一个重复的节点,需要删除。
  2. 为了删除节点,我们需要记录当前节点的前一个节点。在遍历链表的过程中,如果发现重复节点,我们可以将其前一个节点的next指针跳过该节点,指向下一个节点,从而删除该节点。

以下是一个示例代码:

import java.util.HashSet;

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
    }
}

public class Solution {
    public ListNode deleteDuplicates(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        
        HashSet<Integer> set = new HashSet<>();
        ListNode dummy = new ListNode(0);
        dummy.next = head;
        ListNode prev = dummy;
        
        while (head != null) {
            if (set.contains(head.val)) {
                prev.next = head.next;
            } else {
                set.add(head.val);
                prev = head;
            }
            head = head.next;
        }
        
        return dummy.next;
    }
}

在这个代码中,我们首先创建了一个dummy节点作为链表的头节点,这样可以方便我们处理头节点可能被删除的情况。然后,我们遍历链表,如果当前节点的值在HashSet中已经存在,说明这是一个重复节点,我们将其删除;否则,我们将该值添加到HashSet中,并更新prev节点为当前节点。最后,我们返回dummy.next作为新的链表头节点。

需要注意的是,这个算法的时间复杂度是O(n),其中n是链表的长度,因为我们需要遍历链表一次。空间复杂度是O(n),因为我们需要使用HashSet来存储链表的节点值。