在 Linkedlist 程序中维护 'curr' (列表末尾)指针是个好主意吗?
Is it a good idea to maintain 'curr' (End of list) pointer in a Linkedlist program?
- 在链表程序中维护'curr'(列表结束)指针是个好主意吗?
或者我们应该创建一个可以 return 指向最后一个指针的函数
链表的节点?
- 推荐的方法是什么?每种方法的优缺点是什么?
最好跟踪起始节点(根)以便遍历 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 在向列表中添加新节点时保持不变。
在第一种情况下(列表从右向左扩展)您不需要跟踪当前情况并更新它,因为在第二种情况下需要它。
- 在链表程序中维护'curr'(列表结束)指针是个好主意吗? 或者我们应该创建一个可以 return 指向最后一个指针的函数 链表的节点?
- 推荐的方法是什么?每种方法的优缺点是什么?
最好跟踪起始节点(根)以便遍历 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 在向列表中添加新节点时保持不变。
在第一种情况下(列表从右向左扩展)您不需要跟踪当前情况并更新它,因为在第二种情况下需要它。