C 关于链表的第一个和最后一个元素的混淆
我不知道我们是在链表的前面还是后面添加元素。让我们假设我们有一个如下的链表:C 关于链表的第一个和最后一个元素的混淆,c,linked-list,C,Linked List,我不知道我们是在链表的前面还是后面添加元素。让我们假设我们有一个如下的链表:x->a->c->v;这里,x是第一个元素还是最后一个元素?其次,如果我想添加x->a->c->v->h或h->x->a->c->v,该怎么办?当我遇到以下问题时,我感到困惑: 考虑实现循环单链表数据结构。假设循环链表的指针ptr指向其link字段指向链表第一个节点的最后一个节点。完成下面指定的add(…)和delete(…)算法。您可以用伪代码或C代码编写。假设链表节点结构具有以下声明: typedef struct
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) { ... }
第一个元素是
x
,因为如果沿着next
指针链遍历列表,那么这是第一个元素
添加到链接列表时,可以在第一个元素之前或最后一个元素之后添加。在第一个元素之前添加更有效,因为您不必遵循整个
next
指针链来查找结尾 第一个元素是x
,因为如果您沿着next
指针链遍历列表,那么这是第一个元素
添加到链接列表时,可以在第一个元素之前或最后一个元素之后添加。在第一个元素之前添加更有效,因为您不必遵循整个
next
指针链来查找结尾 您可以选择自己列表的方向。通常通过将指向上一个和下一个节点的指针命名为“上一个”和“下一个”。如何命名它们决定了顺序。如果您有一个双链接列表,则节点具有两个指针
然而,您总是存储指向第一个和最后一个元素的指针。这样,您就可以拥有前推
,前推
,后推
,后推
功能
但是,如果您有一个向前列表,(您只在节点中存储next
指针,那么就不能有pop\u back
,因为您的最后一个节点没有到上一个节点的链接,并且您不知道新的最后一个元素会变成什么
那么
- 转发列表可以有:
,向前推
,向前推
向后推
- 向后列表可以有:
,向前推
,向后推
向后弹出
- 和一个双链接列表:
,push_-front
,pop_-front
,push_-back
pop_-back
向前推
,向前推
,向后推
,向后推
功能
但是,如果您有一个向前列表,(您只在节点中存储next
指针,那么就不能有pop\u back
,因为您的最后一个节点没有到上一个节点的链接,并且您不知道新的最后一个元素会变成什么
那么
- 转发列表可以有:
,向前推
,向前推
向后推
- 向后列表可以有:
,向前推
,向后推
向后弹出
- 和一个双链接列表:
,push_-front
,pop_-front
,push_-back
pop_-back
头和尾
在非循环列表中,就像您在问题中显示的列表一样,head
节点将是列表中没有其他节点指向的节点,因此您需要另一个指针,listHead
指针指向它。由于您通常从listHead
指向的节点开始遍历列表,因此head代码>节点也可以被认为是列表中的第一个节点
在非循环列表中,tail
节点是不指向任何其他节点的节点。它可以被视为列表中的最后一个
节点
现在,在循环列表中,就像您链接的文本中引用的列表一样,头
和尾
,以及第一个
和最后一个
的定义可能会更复杂一些,因为每个节点都指向另一个节点,并且有另一个节点指向它。循环列表开始和结束的位置通常是dete由列表的排序顺序(如果有)终止,或其他一些遍历条件控制列表的遍历顺序
一个基本的循环列表可以包括一个listHead
指针,该指针指向在浏览列表时应该访问的第一个
节点
一些更高级的循环列表将改为使用listTail
指针,指向列表的最后一个节点。这是因为,使用循环列表,如果您有指向tail
节点的指针,则很容易到达head
节点,因为tail
节点将指向head
节点。因此,通过提供指向尾部
节点的指针,您可以快速访问列表中的最后一个
和第一个
节点。这是链接文本所描述的数据结构类型
现在,关于插入的问题,这是真实的