插入Sorted LinkedList Java

clo*_*viz 8 java collections linked-list data-structures

我在下面有这个代码,我将一个新的整数插入到一个有序的LinkedList中,但我不认为这是"正确"的做事方式,因为我知道有一个单独的链表,指针指向下一个值和双链表指向下一个和上一个值的指针.我试图使用Nodes来实现以下情况,但Java正在导入这个导入org.w3c.dom.Node(文档对象模型),所以卡住了.

插入案例

  1. 插入空数组
  2. 如果要插入的值少于所有值,请在开头插入.
  3. 如果要插入的值大于所有值,请插入最后一个.
  4. 如果值小于/大于LL中的某些值,则介于两者之间.

    import java.util.*;
    
    public class MainLinkedList {
    public static void main(String[] args) {
    LinkedList<Integer> llist = new LinkedList<Integer>();
    
    llist.add(10);
    llist.add(30);
    llist.add(50);
    llist.add(60);
    llist.add(90);
    llist.add(1000);
    System.out.println("Old LinkedList " + llist);
    
    //WHat if you want to insert 70 in a sorted LinkedList
    LinkedList<Integer> newllist = insertSortedLL(llist, 70);
    System.out.println("New LinkedList " + newllist);
    }
    
    public static LinkedList<Integer> insertSortedLL(LinkedList<Integer> llist, int value){
    
        llist.add(value);
        Collections.sort(llist);
        return llist;
    
    }
    
    Run Code Online (Sandbox Code Playgroud)

    }

小智 19

如果我们使用listIterator,那么get的复杂性将是O(1).

public class OrderedList<T extends Comparable<T>> extends LinkedList<T> {

    private static final long serialVersionUID = 1L;


    public boolean orderedAdd(T element) {      
        ListIterator<T> itr = listIterator();
        while(true) {
            if (itr.hasNext() == false) {
                itr.add(element);
                return(true);
            }

            T elementInList = itr.next();
            if (elementInList.compareTo(element) > 0) {
                itr.previous();
                itr.add(element);
                System.out.println("Adding");
                return(true);
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 不是O(n)吗? (3认同)
  • 这很明显 O(n),加法本身是 O(1),但找到添加它的位置在最坏的情况下是 O(n)... - 所以,这里没有快速获胜。另外,除非你有一些关于排序的额外信息(例如桶排序等),否则你最多可以用 O(logN) 来找到插入的位置... O(1) 是遥不可及的... (2认同)

Mas*_*ter 6

这可能完全符合您的目的:

使用此代码:

import java.util.*;

public class MainLinkedList {
    private static LinkedList<Integer> llist;

    public static void main(String[] args) {
        llist = new LinkedList<Integer>();

        addValue(60);
        addValue(30);
        addValue(10);
        addValue(-5);
        addValue(1000);
        addValue(50);
        addValue(60);
        addValue(90);
        addValue(1000);
        addValue(0);
        addValue(100);
        addValue(-1000);
        System.out.println("Linked List is: " + llist);

    }

    private static void addValue(int val) {

        if (llist.size() == 0) {
            llist.add(val);
        } else if (llist.get(0) > val) {
            llist.add(0, val);
        } else if (llist.get(llist.size() - 1) < val) {
            llist.add(llist.size(), val);
        } else {
            int i = 0;
            while (llist.get(i) < val) {
                i++;
            }
            llist.add(i, val);
        }

    }

}
Run Code Online (Sandbox Code Playgroud)

这个方法将以排序的方式管理List中的插入而不使用 Collections.sort(list)

  • 这应该可以工作,但是不要指望它对大型列表很快,因为在最坏的情况下找到插入点可能导致遍历整个列表. (4认同)
  • 学习这种实现也不理想.您将索引用于链接列表,就像它们是免费操作一样.但是llist.get(i)和llist.add(i,val)都具有O(n)性能,因此整个算法具有O(n log n + n)性能.不要将索引与链表一起使用. (4认同)