请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

链表元素删除

我把ppt删除逻辑看完 自己先尝试着写了一些代码,再回过头看老师的实现,

有一处有出入的地方,可能对GC方面了解的比较浅薄,所以产生了一个疑问;

老师的删除实现中,把删除的节点的next域赋值为null,而我的代码则是直接把删除的节点赋值为null;

所以如果按照我的实现方式,那删除节点中next域中还持有的下一个节点的引用,那这块内存空间最后能不能被GC回收。

public E remove(int index){
  if (index < 0 || index >= size) {
    throw new IllegalArgumentException("LinkedList.remove failed, index is illegal!");
  }

  Node previous = dummyHead;
  for (int i = 0; i < index; i++){
    previous = previous.next;
  }
  Node<E> current = previous.next;
  previous.next = current.next;
  E ret = current.data;
  current = null;
  return ret;
}


正在回答

1回答

将current设为null,只是改变了current这个引用的指向。这个待删除节点的next依然指着原先他所指向的位置。请参考课程这一小节3:10处链表元素删除常见错误的内容,你这样做实质上和其中讲的问题是一致的:)


只不过,不同的是,这样做程序没有错!不存在逻辑的问题。可以再参考这个问答:https://coding.imooc.com/learn/questiondetail/54372.html


0 回复 有任何疑惑可以回复我~
  • 提问者 SsssZzzz #1
    懂了,能不能这么理解,current实质只是remove方法中一个临时存放当前节点引用的变量,对current的操作只是修改它的指向,并没有对链表造成实质的副作用。而维护链表连接关系的是Node节点的next域,所以删除实际就是修改previous和current两个节点的next域。
    回复 有任何疑惑可以回复我~ 2018-05-12 10:01:53
  • liuyubobobo 回复 提问者 SsssZzzz #2
    理解的非常正确!:)
    回复 有任何疑惑可以回复我~ 2018-05-12 10:03:22
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信