对于在链表的前面还是后面添加元素,我感到困惑。让我们假设我们有一个链表是这样:x->a->c->v
; 在这里,x
第一个还是最后一个元素?其次,如果要添加x->a->c->v->h
或我该怎么办h->x->a->c->v
?当我遇到以下问题时,这使我感到困惑:
考虑实现循环单链列表数据结构。假设
ptr
循环链表的指针指向最后一个节点,其link
字段指向链表的第一个节点。完成下面的add(...)
和delete(...)
指定的算法。您可以编写伪代码或C代码。假定链表节点结构的以下声明:typedef struct list_node* list_pointer; typedef struct list_node { int value; list_pointer link; } list_pointer ptr = NULL;
请注意,如果循环链表为空,则其指针
ptr
将设置为NULL
。// Add node at the front of the circular list ptr; ptr points at the last node in the list void add(list_pointer *ptr, list_pointer node) { ... } // Delete the front node from the list ptr list_node delete(list_pointer *ptr) { ... }
用于链接列表的常用术语是head
和tail
。
在非循环列表中,就像您在问题中显示的那样,该head
节点将是列表中其他任何节点都没有指向的节点,因此您需要另一个指针(即一个listHead
指针)来指向它。由于您通常从listHead
指向该节点的节点开始遍历列表,head
因此也可以将该first
节点视为列表中的节点。
在非循环列表中,该tail
节点是不指向任何其他节点的节点。可以将其视为last
列表中的节点。
现在,在一个循环列表中,就像您在链接的文本中引用的列表一样,head
and tail
,and offirst
和and的定义last
可能会稍微复杂一些,因为每个节点都指向另一个节点,并且另一个节点指向该节点。循环列表的开始和结束位置通常由列表的排序顺序(如果有一个或多个其他遍历条件来控制列表的排序顺序)决定。
基本的循环列表可以包含一个listHead
指针,该指针指向first
您在通过列表时应访问的节点。
一些更高级的循环列表将变为使用listTail
指针,指向列表的最后一个节点。这样做是因为,有了循环列表,head
如果您有指向该tail
节点的指针,就很容易到达该节点,因为该tail
节点将指向该head
节点。因此,通过提供指向该tail
节点的指针,您可以快速访问列表中的last
和first
节点。这是链接文本所描述的数据结构的类型。
现在,对于您有关插入的问题,这取决于您以及如何使用列表。如果列表是无序的,则插入新节点作为head
列表的新节点要快得多。但是,如果要实现先进先出列表,则可能要插入新节点作为tail
列表的新节点。当然,如果列表中有订单,则基于每个节点包含的一些数据,那么您想要在列表中找到正确的位置以插入新节点以保留该订单。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句