我知道这是一个重复的问题,但我的问题不同
帮助我理解这段代码的几行。
它从单个链表中删除重复的节点。
public class DeleteDuplicates {
static void deleteDups(LinkedListNode n) {
Hashtable table = new Hashtable();
LinkedListNode previous = null;
while(n!=null) {
if(table.containsKey(n.data)) {
previous.next = n.next;
} else {
table.put(n.data, true);
previous = n;
}
System.out.println(n.next.data);
n = n.next;
}
}
public static void main(String[] args) {
LinkedListNode node_1 = new LinkedListNode("first");
LinkedListNode node_2 = new LinkedListNode("second");
node_1.next = node_2;
LinkedListNode node_3 = new LinkedListNode("third");
node_2.next = node_3;
LinkedListNode node_4 = new LinkedListNode("second");
node_3.next = node_4;
LinkedListNode current = node_1;
deleteDups(current);
while (current != null) {
System.out.println(current.data);
current = current.next;
}
}
}
我的问题是:
n
如何跳过重复节点?我不理解previous
节点的使用以及它如何帮助跳过重复节点。Hashtable
有多重要?我可以使用任何其他集合,例如HashSet
吗?答案 0 :(得分:2)
你已经对问题2有了很好的答案,所以我只关注问题1(顺便说一句,你应该只在每个帖子中提出1个问题)。这是删除重复的工作方式:
在循环的每次迭代中,previous
在节点n
之前保存对列表中节点的引用。因此,当n
设置为node_4
时,previous
设置为node_3
。因此,previous.next = n.next
相当于node_3.next = node_4.next
,因为您没有为node_4.next
设置值等同于node_3.next = null
,这会产生node_3
的效果列表中的最后一个节点,从而从列表中删除node_4
。
如果node_4
不是重复node_3
,而是重复previous
,那么node_2
将是n
,node_3
将是{{} 1}}并且所做的更改将等同于node_2.next = node_3.next
,即node_2.next = node_4
或简单的英语,“将node_2之后的下一个节点设为node_4”,从而有效地删除node_3
清单。
答案 1 :(得分:0)
1)LinkedList没有跳过重复的节点,它被映射出来 - 接下来指向复制后的条目。
2)认为LinkedList
允许重复,但Hashtable
不允许 - >从这个结论中得出结论
答案 2 :(得分:0)
您可以使用您喜欢的任何数据结构来检测重复项。
从实现的角度来看,哈希是很好的,因为它们采用(摊销)常量时间来确定特定元素是否是重复的。
从API的角度来看,Collection.Set
界面很好,因为它保证没有重复的项目。
所以你使用HashSet
的想法看起来非常直观,特别是因为你只对重复的密钥感兴趣,而不考虑实际的节点对象。