第5题 统计带头节点的单链表L的实际元素个数
编写算法,统计带头节点的单链表L的实际元素个数。
得分点(必背)
代码语言:javascript复制// 统计带头节点的单链表L的实际元素个数(得分点)
int listLength(LNode *L) {
int count = 0; // 计数器
LNode *p = L; // 临时指针
//从头节点的下一个结点开始遍历
while(p->next != NULL) {
count ; // 计数器加1
p = p->next; // 指针后移
}
return count;
}
题解:统计带头节点的单链表L的实际元素个数
在这个题目中,我们需要编写一个函数来统计带头节点的单链表L的实际元素个数。带头节点的单链表意味着链表的第一个节点(头节点)不存储有效数据,仅用于标记链表的起始点。因此,我们统计的是头节点之后的节点个数。
代码解答
代码语言:javascript复制int listLength(LNode *L) {
int count = 0; // 计数器,初始化为0
LNode *p = L; // 临时指针p,指向链表的头节点L
// 从头节点的下一个结点开始遍历
while(p->next != NULL) {
count ; // 每遍历一个节点,计数器加1
p = p->next; // 临时指针后移,指向下一个节点
}
return count; // 返回计数器的值,即链表中实际元素的个数
}
详细解释
1、函数定义和参数:
代码语言:javascript复制int listLength(LNode *L)
listLength
是函数名,返回值类型是int
,表示链表中元素的个数。LNode *L
是函数的参数,表示指向链表头节点的指针。
2、计数器初始化:
代码语言:javascript复制int count = 0;
- 定义一个整型变量
count
,初始值为0,用于记录链表中实际元素的个数。
3、定义临时指针:
代码语言:javascript复制LNode *p = L;
- 定义一个临时指针
p
,并让它指向链表的头节点L
。我们将使用这个指针遍历链表。
4、遍历链表:
代码语言:javascript复制while(p->next != NULL) {
-
while
循环用于遍历链表。条件是p->next != NULL
,即当前节点p
的下一个节点不为空。当p
的下一个节点为空时,说明我们已经遍历到链表的末尾。
5、计数器累加:
代码语言:javascript复制count ;
- 每遍历一个节点(除了头节点外),计数器
count
加1。
6、指针后移:
代码语言:javascript复制p = p->next;
- 临时指针
p
后移,指向下一个节点。这样在下一个循环中可以检查和计数下一个节点。
7、返回计数器的值:
代码语言:javascript复制return count;
- 当
while
循环结束时,count
的值就是链表中实际元素的个数。返回这个值。
举例说明
假设链表如下所示:
代码语言:javascript复制L -> A -> B -> C -> NULL
其中,L
是头节点,A
, B
, C
是实际存储数据的节点。
- 初始时,
count = 0
,p = L
- 第一次循环:
p
指向A
,count = 1
- 第二次循环:
p
指向B
,count = 2
- 第三次循环:
p
指向C
,count = 3
p
指向C
后,C
的next
为NULL
,循环结束。
最终,count
的值为 3
,即链表中实际元素的个数。