c语言链表相关习题
时间: 2025-04-30 21:46:03 浏览: 21
### C语言链表练习题
#### 反转单链表
对于反转单链表的问题,可以采用迭代的方法实现。通过三个指针变量 `prev`、`current` 和 `next` 来逐步翻转链表中的每一个节点指向的方向[^1]。
```c
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* reverseList(struct ListNode *head) {
struct ListNode *prev = NULL, *current = head, *next;
while (current != NULL) {
next = current->next; // 记录下一个节点
current->next = prev; // 当前节点指向前一个节点
prev = current; // 移动到下一位置
current = next;
}
return prev;
}
```
此代码片段展示了如何利用三个辅助指针完成链表的反转工作。该算法的时间复杂度为 O(n),其中 n 是链表中节点的数量。
#### 创建并统计单链表
另一个常见的练习是创建一个由用户输入构成的单链表,并计算其长度。这可以通过动态分配内存给新节点并将它们链接在一起的方式完成[^3]。
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node *next;
} Node;
Node* createLinkedList(int size) {
if (size <= 0) return NULL;
Node *head = NULL, *tail = NULL;
for (int i = 0; i < size; ++i) {
Node *new_node = (Node *)malloc(sizeof(Node));
printf("Enter element %d: ", i);
scanf("%d", &(new_node->data));
new_node->next = NULL;
if (!head) { // 如果列表为空,则初始化头部和尾部
head = tail = new_node;
} else { // 否则追加到现有列表后面
tail->next = new_node;
tail = new_node;
}
}
return head;
}
void countNodes(Node *list) {
int count = 0;
while(list){
list = list->next;
count++;
}
printf("Number of nodes in the linked list is :%d\n",count);
}
```
这段代码实现了从标准输入读取一系列整数值来构建单向链表的功能,并提供了一个函数用于打印链表中元素数量的信息。
#### 单链表的操作与特性
当涉及到带有头尾指针的单链表时,某些特定操作可能依赖于链表的实际大小。例如,在删除最后一个元素或者访问最后几个元素的情况下,这些动作通常需要遍历整个链表才能找到目标位置,因此时间开销会随着链表的增长而增加[^4]。
阅读全文
相关推荐



















