【问题标题】:LinkedList delete : why don't we override the head with previous?LinkedList 删除:为什么我们不用之前的覆盖头部?
【发布时间】:2019-11-01 21:40:07
【问题描述】:

查看我的数据结构,了解一些新的工作面试要求。所以我有一个链接列表的删除方法。

public Link delete(int key) {
    Link current = first;
    Link previous = first; 
    while(current.iData != key) {
        if(current.next == null) 
            return null;
        else {
            previous = current; 
            current = current.next;
        }
    }

    if(current == first)
        first = first.next;
    else
        // just bypass it
        previous.next = current.next;
    return current;
}

到目前为止,我想我已经理解了。但我对这条线很好奇。

// just bypass it
previous.next = current.next;

为什么我们不用previous 覆盖head(在本例中表示为first)?或者会是错误的逻辑吗?喜欢

// just bypass it
previous.next = current.next;
first=previous;

我的意思是previouscurrent 只是迭代列表的指针。而删除后的真实数据位于first对吗?抱歉,如果这样想会很奇怪。有时我在学习算法时会出现奇怪的直觉,主要是因为我有点弱

【问题讨论】:

    标签: java algorithm pointers data-structures linked-list


    【解决方案1】:

    这样做会导致您的链表丢失前一个节点之前的所有节点。如果您有一个包含以下值的链表:

    [1, 2, 3, 4, 5, 6, 7, 8]
    

    如果你调用了delete(7),你的头会指向6,你会得到一个[6, 8]的链表。

    【讨论】:

    • 实际上在我运行它之后,first=previous 行不会影响previous.next = current.next 结果。尽管您的答案在逻辑上看起来是正确的,但我认为我的答案只能由语言架构师来回答,因为他们是设计记忆模型的人。现在我只关注在面试中遇到这个问题的指针(即 previous.next = current.next 已经足够了,因为它已经显示了删除节点的要点)
    • 我不确定你的意思。您的代码没有显示 first 是如何初始化的,所以我认为它是某个 LinkedList 类的成员变量。内存模型和这个问题有什么关系?
    • 我已经对您的回答感到满意。这已经很好地回答了这个问题:)
    猜你喜欢
    • 2019-08-22
    • 2022-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多