这是“ Java中的数据结构和算法(第六版)”一书中的代码片段。该方法是LinkedPositionalList实现的一部分。 我不确切知道这行是什么: “ if(node.getNext()== null)//失效节点的约定” 是为了。我希望对其功能进行一些解释。
class PostsFragment : Fragment() {
private lateinit var recyclerView: RecyclerView
private lateinit var viewManager: RecyclerView.LayoutManager
private lateinit var mAdapter : PostsRecyclerAdapter
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
setHasOptionsMenu(true)
val view : View = inflater.inflate(R.layout.fragment_posts, container, false)
recyclerView = view.findViewById<RecyclerView>(R.id.posts_recycler)
viewManager = LinearLayoutManager(context).apply {
this.reverseLayout = true
this.stackFromEnd = true
}
return view
}
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
val myTopPostsQuery = FirebaseUtil.getBaseRef().child("posts")
.orderByChild("timestamp")
val myTopPostsQuery = FirebaseUtil.getBaseRef().child("posts")
.orderByChild("timestamp")
val options : FirebaseRecyclerOptions<Post> =
FirebaseRecyclerOptions.Builder<Post>()
.setQuery(myTopPostsQuery, Post::class.java)
.build()
mAdapter = PostsRecyclerAdapter(options)
recyclerView.layoutManager = viewManager
recyclerView.adapter = mAdapter
}
override fun onStart() {
super.onStart()
mAdapter.startListening();
}
override fun onStop() {
super.onStop()
mAdapter.stopListening()
}
}
答案 0 :(得分:2)
您要询问的书中的实现使用一个显式的trailer
节点,该节点表示结构中的“末尾一个”位置。因此,列表中的所有节点都必须有一个下一个节点。因此,如果节点的getNext()
方法返回null
,则该节点不在列表中。
答案 1 :(得分:1)
在这种情况下, 失效节点 表示不存在的节点。
if (node.getNext( ) == null) // convention for defunct node
在这种情况下,节点p
有一个称为getNext()
的方法,该方法可以返回null,如果返回,则表示它是最后一个节点。 换句话说,没有下一个节点。
顾名思义,这种结构相互链接。 getNext()应该在内存中返回下一个节点的位置,如果该位置不存在,则那里没有节点。
通常,node
可能会使用一种名为setNext(Position<E> next)
的方法,这是为该节点保存下一个项目位置的副本。
答案 2 :(得分:0)
如果您在书中阅读了第7章的“双向链接列表实现”部分,则说明不存在位置概念的产生是因为摆脱了列表中的任何移除位置(节点)。因为remove()
方法实现了将要删除的位置设置为null
值。
因此validate()
方法实际上检查输入位置是否没有从列表中删除。再次,通过检查是否调用getNext()
来获取null
的值。如果是这样,则必须使用null
方法将其设置为remove()
作为删除位置。因此,由于输入位置p在列表中不再(由于已删除位置)而引发错误。
为了更好地理解,只需参考本书中的delete()方法即可。这是书中的内容:
// Removes the element stored at Position p and returns it (invalidating p).
public E remove(Position<E> p) throws IllegalArgumentException {
Node<E> node = validate(p);
Node<E> predecessor = node.getPrev();
Node<E> successor = node.getNext();
predecessor.setNext(successor);
successor.setPrev(predecessor);
size−−;
E answer = node.getElement();
node.setElement(null); // help with garbage collection
node.setNext(null); // and convention for defunct node
node.setPrev(null);
return answer;
}