系统相关
首页 > 系统相关> > java-从链接列表末尾删除Kth节点的内存有效方法

java-从链接列表末尾删除Kth节点的内存有效方法

作者:互联网

这是几个已知解决方案的一个已知问题,但是我目前的努力是尝试考虑内存使用情况(而不是时间复杂性),找到解决问题的最有效方法.

问题:给定一个未知大小(但可能很大)的单链接列表,请从列表末尾删除第K个成员. 0< = K< N. 如果K为0,则删除列表的最后一个节点.如果K = N-1,则删除列表中的第一个节点. 我最初的方法是递归-它是最简单的编写方法,其时间复杂度为O(N)-遍历列表两次,最后又一次返回.

public int removeKLast(Node<T> node, int k) {
    if (node.getNext() == null) {
        return k;
    } else {
        int current = removeKLast(node.getNext(), k);
        if (current == 0) {
            node.setNext(node.getNext().getNext());
        }
        return current - 1;
    }
}

它有一些需要解决的最终情况(例如从列表中删除第一个节点),但在其他方面很简单.

我的问题是这种实现方式意味着整个链表都存储在内存中,开销与对象相关联.我想知道是否可以找到一个更有效的解决方案(仍然是O(N)时间,最多在列表上运行两次),在任何给定时间使用内存中最多K个原始整数.

解决方法:

开始列表遍历.在K步之后,启动第二个迭代器,然后并行行走.当第一个迭代器到达末尾时,第二个迭代器站在要删除的节点上.

这种方法不能改变O(n)的复杂度,并执行大约2n(2n-k)个步骤操作,但是排除了末端查找和删除之间的“延迟”

标签:space-complexity,memory-efficient,linked-list,java,algorithm
来源: https://codeday.me/bug/20191110/2015324.html