java - 确定在列表末尾 append 值的复杂性

标签 java linked-list append time-complexity

众所周知,将一个元素压入列表的前面需要 O(1) 时间。现在考虑我们想要在列表末尾放置(或追加)一个元素。这个操作的复杂度是多少?

现在考虑一下,要将一个元素放在列表的末尾,我们需要遍历列表直到末尾(因为没有 prev. 指针),需要 O(n) 时间复杂度。有可能在 O(1) 内完成这个任务吗?

我做了一些实现,在末尾 append 值时,我保留了指针中可以插入节点的下一个位置。请检查以下内容:

import java.util.*;

class List{

    int data;
    List next;
    List(int data){
       this.data = data;
    }
}

class Driver{

    List head, temp;

    Driver(){
       head = null;
       temp = head;
    }

    void push(int item){

       if(head == null){
          head = new List(item);
          temp = head;
       } else {
          temp.next = new List(item);
          temp = temp.next;         
       }
    }
}

class AppendInList{

    public static void main(String [] args){

       Driver obj = new Driver();
       obj.push(5);
       obj.push(66);
    }
}

我在SO中搜索,但没有得到任何让我满意的东西!如果我做错了请纠正我!

最佳答案

如果您在链表数据结构中保存对前/头元素的引用,则可以在 O(1) 时间内将元素推送到链表的前面。

类似地,您可以维护对 last 元素的引用,使用它可以在 O(1) 时间内将元素添加到最后一个元素。每次添加元素时,您都必须更新 last 指针。

数据结构如下所示:

class List{
    ListNode head;//ListNode class stores next reference and value of the node
    ListNode tail;//last element
    void pushToLast(ListNode newElement){
         //TODO : Take care of corner cases
         tail.next = newElement;
         tail = newElement;
    }
}

关于java - 确定在列表末尾 append 值的复杂性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54881330/

相关文章:

java - 如何通过互联网在两台计算机之间发送数据

C:结构语法链表

java - 如何评估通过链表或数组列表实现的二叉树的性能?

多个链表可以共享相同的结构吗?

couchdb - 在 CouchDB 中可以访问旧数据吗?

jQuery: append 和替换内容

java - NetBeans J2ME FileBrowser 仅浏览文件夹?

java - 如何解析此输出并分隔每个字段/单词

r - 如何将向量 append 到 R 中的向量列表而不诉诸索引?

java - 在java8中迭代嵌套对象