移除重复结点,需要知道哪些结点是重复的,可以用一个哈希表, 如果有重复的元素,则将该元素从链表里删除,然后继续迭代
hashtable基本用法:
int size();得到键值对数
boolean isEmpty();判断是否为空
boolean containsKey(Object key);判断是否包含以key为键的键值对
boolean containsValue(Object key);判断是否包含以key为值的键值对
Object get(Object key);获取以key为键的对应的值
Object put(Object key, Object value);增加key为键value为值的键值对
Object remove(Object key);去除键为key的键值对
void clear();去除去部键值对
import java.util.Hashtable;
public static void deleteDups(LinkListNode n) {
LinkListNode previous = null;
Hashtable table = new Hashtable();
while(n != null){
if (table.containsKeys(n.data)) {
preious.next = n.next;
}
else {
table.put(n.data, true);
previous = n;
}
n = n.next;
}
}
进阶:如果不得使用缓冲区
用两个指针,一个current迭代地访问整个链表,一个runner用于检查每个current后续结点是否重复,这样做的时间复杂是O(n2), 空间复杂度是O(1)
public static void deleteDupsNew(LinkListNode head) {
if (head == null) return;
LinkListNode current = head;
while(current != null){
LinkListNode runner = current;
while (runner.next != null){
if(runner.next.data == current.data){
runner.next = runner.next.next;
}
else{
runner = runner.next;
}
}
current = current.next;
}
}