在 Linkedlist 程序中维护 'curr' (列表末尾)指针是个好主意吗?

Is it a good idea to maintain 'curr' (End of list) pointer in a Linkedlist program?

最好跟踪起始节点(根)以便遍历 list.Coming 回到你的想法,为了从后面遍历你必须使用 doubly/cyclic 链表,其中前导节点的地址由其后继节点持有,或者最后一个节点以循环形式连接到第一个节点。

了解一下 双向链表: https://en.wikipedia.org/wiki/Doubly_linked_list
循环链表: http://www.martinbroadhurst.com/articles/circular-linked-list.html

唯一的好处是增加效率。

您可以维护一个指向最后一项的指针,但只有当您有一个描述整个列表的 struct 时才应该这样做。您不应在全局范围内执行此操作,因为您将无法拥有多个列表。

struct {
  LinkedListNode next;
  //data
} LinkedListNode

描述列表的struct可能是这样的:

struct {
  LinkedListNode first; //required
  LinkedListNode last; //optional, makes adding quicker
} LinkedList

然后您必须使用带有 LinkedList 的函数来操作列表,这些函数将需要您做更多的工作和测试以确保指针始终正确。

此方法的另一个缺点是您无法快速列出子列表。也就是说,您不能只执行此操作 sublist = node->next; 以获得已跳过某些元素的列表。

所以另一种方法是不使用 LinkedList 结构,只是在添加多个项目时临时存储结束指针。

创建链表的最简单方法是 您不必跟踪添加到列表中的最后一个节点,即 curr。在那个列表中你唯一需要注意的是 head (它指向列表中的第一个节点)和 temporary (变量是将被添加到列表中)。

伪代码:

`  
while(you wanna add more nodes in the list)
                   {
                              temporary->next=head;
                              head=temporary;
                   }

`

这个列表从右到左扩展,即 1(头部为 1)然后 2->1(现在头部为 2)然后 3->2->1(现在头部为 3)等等on,可以看到新添加的节点成为了head

当你从 left 添加元素到 right 时,你需要注意三件事,即 head 临时当前

伪代码是:

`
 current =head;
while(you wanna add more nodes in the list)
                   {
                              current->next=temporary;
                              current=temporary
                   }

`

此列表从 left 扩展到 right,即 1(head 为 1)然后 1->2 (仍然是 2)然后 1->2->3(仍然是 3)等等,你可以看到 head 在向列表中添加新节点时保持不变。

在第一种情况下(列表从右向左扩展)您不需要跟踪当前情况并更新它,因为在第二种情况下需要它。