我正在实现一个有序的链表,我想知道在调用insert方法时处理重复记录的最有效方法是什么。最好在操作之前搜索记录是否已经存在,或者评估记录是否在操作中已经存在并抛出异常?
方法1
public void insert(int key){
if(isEmpty())
head = new Node(key);
else if(key < head.data){
/* Code to verify if they are equal */
/* ... */
/* ... */
Node new_node = new Node(key);
new_node.next = head;
head = new_node;
}else{
Node tmp = head;
while((head.nex != null) && (key > tmp.key)){
/* Code to verify if they are equal */
/* ... */
/* ... */
tmp = tmp.next;
}
/* Create node and change "pointers"*/
/* ... */
/* ... */
}
}
方法2
public void insert(int key){
if(exists(key)){
/* Throw an exception */
}
/* Code for insert element */
/* ... */
/* ... */
}
答案 0 :(得分:1)
由于您在询问效率,因此对“插入”实现中的重复项进行检查将总是更加高效。这就是为什么,假设您有一个包含N个元素的排序链表。您尝试插入的元素大于列表中当前的任何元素。如果先搜索然后插入,则必须遍历N个元素以确认该元素不在列表中。然后,您将再次遍历N个元素,以找到插入新元素的正确位置。
我建议编写一个“搜索”方法,该方法返回的节点的最大键小于或等于您要搜索的键。例如,给定列表{ 1, 2, 5, 7, 10 }
和搜索关键字6
,您的搜索方法应返回节点5
。现在,您可以在insert方法内部调用search,如果返回的结果是带有您要搜索的键的节点,或者返回的最大键仍小于您的搜索键的节点,那么您可以在其中插入一个包含搜索的新节点核心价值。像这样:
insert(k)
Node n = search(k) // what should search return if the list is empty?
if (n.data < k)
// insert new node after "n"
else
// handle existing key
希望这会有所帮助!