【问题标题】:How to find the last element in the singly linked list?如何找到单链表中的最后一个元素?
【发布时间】:2013-06-26 21:54:25
【问题描述】:

在单链表中,我们知道最后一个节点的next指向null,这样我们就可以通过遍历找到了。

如果单链表的最后一个节点指向某个中间节点,那么如何找到最后一个节点?

【问题讨论】:

  • 问题不清楚。如果您对循环检测感兴趣:查找 Floyd 算法。

标签: data-structures linked-list


【解决方案1】:

简单的只是遍历并满足最后一个指向null的条件

void printlast(Node* n){
    while(n!=NULL){
        n=n->next;
        if(n->next==NULL){
            cout<<n->data<<" ";
        }
    }
}

【讨论】:

    【解决方案2】:

    即使在单链表中,您也可以使用尾指针。它仍然是一个单链表,但它避免了O(n=1) 查找最后一个节点。

    【讨论】:

      【解决方案3】:

      好吧,我想给节点加上一个“is_visited”布尔值就可以了:

      //make sure the counters of all nodes are 0
      cur=head_node
      cur->visit=1
      while( cur->next!=null AND cur->next->visit==0) {
        cur=cur->next
        cur->visit=1
      }
      //cur points to the last node
      

      【讨论】:

      • 我不会更改节点的结构,因为其中存储了数据。而且我在链表中​​有超过 50000 个节点。
      • @Raaga 那么您将不得不遍历每个节点的列表,不是吗?最坏情况 O(N^2)。这是你的电话
      【解决方案4】:

      如果“最后一个节点”指向其他节点,那么它就不是真正的最后一个节点,是吗?更不用说这会延伸并可能打破普遍接受的“列表”定义。

      通常要找到最后一个元素,你会做类似的事情

      Node *current = list.start,
           *next = current.next;
      
      while (next != null)
      {
          current = next;
          next = current.next;
      }
      
      print("Last node is " + current->value);
      

      但是,这假定您的“最后一个节点”确实指向 null。否则会陷入死循环。

      将指针保留在列表的最后一个节点以及第一个节点通常是一种很好的做法,因此这是一个不依赖于指向 null 的最后一个节点的简单解决方案。

      【讨论】:

      • 我相信这段代码在 list.start != nullptr 的假设下工作。(非空列表)如果给定的 start 是 nullptr,则行。 2 会导致错误。
      猜你喜欢
      • 2014-01-11
      • 2013-04-11
      • 2015-06-29
      • 1970-01-01
      • 2013-12-10
      • 2010-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多