删除无序单链表中值重复出现的节点
给定一个无序单链表的头节点head,删除其中值重复的节点
例如: 1->2->3->3->4->4->2->1->1->null 删除之后变为 1->2->3->4->null
方法1:如果链表长度为N,时间复杂度达到O(N)
方法2:如果要求空间复杂度为O(1),应该怎样实现
【解析】
方法1:利用哈希表去实现
使用哈希表,因为头节点是不用删除的节点,所以首先将头节点放入到哈希表中,然后从下一个节点开始遍历
如果哈希表中已经包含下一个节点,那么就让cur的上一个存在的节点 pre pre.next = cur.next
如果哈希表中不包含下一个节点,那么就让pre = cur
方法2:类似选择排序的过程
package com.test; import com.test.ListNode; import java.util.HashSet; /** * Created by Demrystv. */ public class RemoveRepeat { /** * 方法一:利用哈希表,其时间复杂度是 O(N),空间复杂度是 O(N) */ public void removeRepeat1(ListNode head){ if (head == null){ return; } HashSet<Integer> hashSet = new HashSet<Integer>(); ListNode pre = head; ListNode cur = head.next; hashSet.add(head.val); while (cur != null){ if (hashSet.contains(cur)){ pre.next = cur.next; }else { hashSet.add(cur.val); pre = cur; } cur = cur.next; } } // 方法二:类似选择排序的过程,时间复杂度是O(N^2),空间复杂度是O(1) public void removeRep2(ListNode head) { ListNode cur = head; ListNode pre = null; ListNode next = null; while (cur != null) { pre = cur; next = cur.next; while (next != null) { if (cur.val == next.val) { pre.next = next.next; } else { pre = next; } next = next.next; } cur = cur.next; } } }