处理链接列表中的重复记录的最有效方法是什么?

时间:2019-07-01 22:32:00

标签: java performance data-structures linked-list

我正在实现一个有序的链表,我想知道在调用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 */
    /* ... */
    /* ... */       
}

1 个答案:

答案 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

希望这会有所帮助!