为什么要使用“ node.getNext()== null”作为已失效节点的约定?

时间:2019-01-05 16:07:46

标签: java data-structures

这是“ 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()
    }
}

3 个答案:

答案 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;
}