Data structures 如何找到单链表中的最后一个元素?

Data structures 如何找到单链表中的最后一个元素?,data-structures,linked-list,Data Structures,Linked List,在单链表中,我们知道最后一个节点的下一个节点指向null,因此我们可以通过遍历找到它 如果单链表的最后一个节点指向某个中间节点,那么我们如何找到最后一个节点?如果“最后一个节点”指向其他节点,那么它实际上不是最后一个节点,是吗?更不用说,这将延伸并可能打破普遍接受的“清单”定义 通常,要找到最后一个元素,您需要执行以下操作 Node *current = list.start, *next = current.next; while (next != null) { curr

在单链表中,我们知道最后一个节点的下一个节点指向
null
,因此我们可以通过遍历找到它

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

如果“最后一个节点”指向其他节点,那么它实际上不是最后一个节点,是吗?更不用说,这将延伸并可能打破普遍接受的“清单”定义

通常,要找到最后一个元素,您需要执行以下操作

Node *current = list.start,
     *next = current.next;

while (next != null)
{
    current = next;
    next = current.next;
}

print("Last node is " + current->value);
但是,这假设“最后一个节点”实际上指向null。否则,您将陷入无限循环

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

好吧,我想将“is_visted”布尔值放在节点上会很好地满足:

//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

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

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

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

coutI不会改变节点的结构,因为我在其中存储了数据。而且我在链表中有50000个以上的节点。@Raaga,那么你必须对每个节点的列表进行迭代,不是吗?最坏的情况是O(N^2)。这是你的问题。如果你对循环检测感兴趣:lookup Floyd的算法。