Java LinkedList删除:为什么不';我们不能用前面的命令覆盖头部吗?
查看我的数据结构,了解一些新的工作面试要求。所以我有一个链接列表的删除方法Java LinkedList删除:为什么不';我们不能用前面的命令覆盖头部吗?,java,algorithm,pointers,data-structures,linked-list,Java,Algorithm,Pointers,Data Structures,Linked List,查看我的数据结构,了解一些新的工作面试要求。所以我有一个链接列表的删除方法 public Link delete(int key) { Link current = first; Link previous = first; while(current.iData != key) { if(current.next == null) return null; else { previous
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;
为什么我们不用前面的覆盖头部(在本例中表示为第一个)?或者这是错误的逻辑?像
// just bypass it
previous.next = current.next;
first=previous;
我的意思是previous
和current
只是迭代列表的指针。删除后的真实数据位于第一个
右侧?抱歉,如果这样想会很奇怪,为什么。有时我在研究算法时会产生奇怪的直觉,主要是因为我有点弱,这样做会导致你的链表丢失前一个节点之前的所有节点。如果有具有以下值的链接列表:
[1, 2, 3, 4, 5, 6, 7, 8]
你调用了delete(7)
,你的头会指向6
,你会有一个[6,8]
的链接列表,实际上在我运行它之后,first=previous
行不会影响previous.next=current.next
结果。尽管你的答案在逻辑上是正确的,但我认为我的答案只能由languange架构师来回答,因为他们是设计内存模型的人。现在,每当我在面试中遇到这个问题时,我只关注指针(即previous.next=current.next已经足够了,因为它已经显示了删除节点的要点),我不确定你的意思。您的代码没有显示如何初始化first
,因此我假设它是某个LinkedList类的成员变量。记忆模型与这个问题有什么关系?我已经对你的答案感到满意了。这已经很好地回答了这个问题:)