For the first function, shouldn't "prev = head" be outside of else because we want to set the previous every time before we change the head value?
For the second function, shouldn't "p2 = p2.next" be outside of else because we want to go next every time?
Thank you guys.
//This would take O(n) but would require extra space O(n)
public static Node removeDuplicates(Node head){
Node prev = null;
Set<Integer> hs = new HashSet<Integer>();
while(head!= null){
if(hs.contains(head.data)){
prev.next = head.next;
}
else{
hs.add(head.data);
//why is prev = head here instead of out of the else statement?
prev = head;
}
head = head.next;
}
return head;
}
//This would take O(n^2) but no extra space is required.
public static Node removeDuplicatesTradeOff(Node head){
//pointer 1 and pointer 2.
Node p1 = head;
while(p1.next != null){
Node p2 = p1;
while(p2.next != null){
if(p1.data == p2.next.data){
p2.next = p2.next.next;
}
else{
//why is p2 = p2.next here instead of out of the else statement?
p2 = p2.next;
}
}
p1 = p1.next;
}
return head;
}