删除无序单链表中值重复出现的节点
给定一个无序单链表的头节点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;
}
}
}