2017-10-16 59 views
3

链表:C++链表遍历和修改

pointer2 -> [a] 
pointer ->[a] -> [b] -> [c] -> [d] -> null  
pointer = b; //makes it point one down so it will be pointer -> [b] ->[c] -> [d] -> null  
pointer = pointer 2; //makes pointer point back to where it was pointing to before, both pointers point to [a] 
pointer2 = pointer->next; //makes pointer 2 point to [b] 
pointer2->next = pointer->next; //makes [c] point to [b] 

是我的理解是否正确?节点可以指向自己吗?像pointer-> next = pointer-> next

基本上是:

  • 指针=指针2 - 使指针指向任何指针2指向?
  • 指针 - >下一=指针2 - 使该指针指向指向指针2链路节点链路节点
  • 指针 - >下一= pointer2->下 - 使该指针指向后指向一个链路节点指针指向的链接节点
  • 指针=指针2 - >下一个 - 使指针指向指向一个指针2后的链接节点的指针。

是吗?

+0

在普通PC上,指针变量只是一个整数,其值是一个地址在记忆中。您可以像任何其他变量一样以任何方式分配此值。只要变量的类型当然是兼容的。 –

+0

是的,我明白指针是什么。我试图确认我是否理解如何浏览链接列表是正确的。如果底部的这些任务按照我认为他们所做的做。 – Duxa

回答

1

节点能指向自己吗?

正如其他人所说,这当然是可能的。但是,也许你的意思是“这是否有效?”。答案就是,它取决于操纵链表的代码。如果您正在编写该代码,那么这取决于您是否有效

例如,您可能会决定当节点指向自身时,则表示链接列表的末尾。那么这里就是你怎么可能代码搜索一个整数链表数3功能:

struct ListNode { 
    int value; 
    ListNode* next; 
}; 

bool containsThree(ListNode* list) { 
    for (; list->next != list; list = list->next) { 
     if (list->value == 3) { 
      return true; 
     } 
    } 
    // Also check final node 
    if (list->value == 3) { 
     return true; 
    } 
    return false; 
} 

另外,您可以决定next == nullptr意味着列表的末尾。在这种情况下containsThree看起来更像是这样的:

bool containsThree(ListNode* list) { 
    for (ListNode* node = list; node; node = node->next) { 
     if (node->value == 3) { 
      return true; 
     } 
    } 
    return false; 
} 

有了这项新功能,如果在本身的任何节点分则函数会永远循环下去。你可以解决这个问题,甚至在列表中选中了较大的循环,就像这样:

bool containsThree(ListNode* list) { 
    std::set<ListNode*> seenNodes; 
    for (ListNode* node = list; node; node = node->next) { 
     if (seenNodes.count(node)) { 
      break; 
     } 
     seenNodes.insert(node); 
     if (node->value == 3) { 
      return true; 
     } 
    } 
    return false; 
} 

有此功能的最后一个问题:它比前一个显著的性能损失。因此,是否允许列表中的循环取决于您,并且您将在命令中检查它们,否则将不允许循环。任何一个都是正确的,你只需要做出决定并坚持下去。

(编辑:第一个例子功能是有点乱,因为刚刚我们期待在最后一个节点3之前结束循环的条件这样做,它也不可能在一个空的列表来传递这两个。 nullptr例子中的问题已经修复,但实际上甚至可以使用“node == node->next意味着列表结束”规则来修复它们,关键是在链表的末尾添加一个虚拟节点,并要求这个额外的节点具有这个属性,你不需要检查这个节点是否具有三重性,而这个节点本身就表示一个空的列表)。

0

你是最后一个指针赋值权exect:

... 
pointer2 = pointer->next; //makes pointer 2 point to [b]: Ok 
pointer2->next = pointer->next; //makes [c] point to [b]: Wrong 

pointer2点,[B],并pointer->next点到B。最后指针赋值使乙组分本身导致:

pointer2 -> b -> b ! 

和:

pointer -> a -> b -> b 

你误解可能来自一个事实,即你的伪代码不明确什么是a,b,C和d,代表下一步以及您使用地址的位置。写下所有这些都是C++,它会更清晰。

0

Linked data structure有一个指针用于当前数据,一个用于下一个(它是指向下一个当前数据的指针),如果是双向链表,那么一个指向前一个(这是指向当前数据的指针的前一个)。

节点能指向自己吗?像pointer-> next = pointer-> next

是的。这与将任何指针分配给自身相同。不是很有用。

  • 指针 - >下一= pointer2->下 - 使该指针指向指针2点
  • 指针= pointer2->下链路节点之后指向一个链路节点 - 使指针指向一个pointer2指向的链接节点之一。

在此之后然而,当前数据指针和下一个数据指针是相同的,点同样的事情。这意味着如果有人想沿着这个链表进行遍历,如果他们没有指针检查,它们可能会以无限循环结束。