方法一
思路:遍历链表,将链表中的数据存储到HashTable中,若当前遍历的数据在HashTable中存在,说明这个数据重复,可以将这个数据删除掉。
代码实现:
public void deleteRepeat(Node head){
Hashtable<Integer,Integer> hashTable = new Hashtable<Integer,Integer>();
Node temp = head;
Node preNode = null;
while(temp != null){
if(hashTable.containsKey(temp.data)){
preNode.next = temp.next;
} else {
hashTable.put(temp.data,1);
preNode = temp;
}
temp = temp.next;
}
}
优点:时间复杂度较低。
缺点:空间复杂度高,要申请额外的空间。
方法二
思路:对链表进行双重循环遍历,外层循环正常遍历链表,若当前遍历到的结点为curNode,内层循环从curNode.next开始遍历,若碰到与curNode结点的值相同的结点,删除掉这个重复的结点。
代码实现:
public void deleteRepeat(Node head){
Node temp = head;
while(temp != null){
Node insideNode = temp;
while(insideNode.next != null){
if(temp.data == insideNode.next.data){
insideNode.next = insideNode.next.next;
} else {
insideNode = insideNode.next;
}
}
temp = temp.next;
}
}
优点:空间复杂度较低,不需要申请额外的空间。
缺点:时间复杂度较高。