题目描述:采用尾插法在头指针L处建立一个带头结点的单链表,输入-1表示结束结果返回建立的单链表。
算法思想:
1.初始化链表:创建一个头结点(不存储实际数据),头指针 L 指向该头结点。初始时,头结点的 next 指针为 NULL,尾指针 tail 也指向头结点。
2.循环输入数据:从用户输入中读取数据,直到输入 -1 为止。
对于每个非 -1 的数据,创建一个新节点,并将数据存入新节点的数据域。
将新节点插入到尾节点之后(即 tail->next = newNode)。
更新尾指针,使其指向新节点(即 tail = newNode)。
3.结束处理:输入 -1 后,将尾节点的 next 指针置为 NULL,表示链表结束。
4.返回链表:返回头指针 L,即建立的单链表。
复杂度分析:
时间复杂度:O(n)
空间复杂度:O(n)
代码实现:
cpp
#include <stdio.h>
#include <stdlib.h>
// 定义单链表结点结构
typedef struct LNode {
int data; // 数据域
struct LNode *next; // 指针域
} LNode, *LinkList;
// 尾插法创建单链表
LinkList CreateList_Tail() {
LinkList L = (LinkList)malloc(sizeof(LNode)); // 创建头结点
L->next = NULL; // 头结点的next初始化为NULL
LNode *tail = L; // 尾指针初始指向头结点
int x;
printf("请输入链表元素(以-1结束):\n");
scanf("%d", &x);
while (x != -1) {
LNode *p = (LNode *)malloc(sizeof(LNode)); // 创建新结点
p->data = x; // 赋值
p->next = NULL; // 新结点的next为NULL
tail->next = p; // 尾结点的next指向新结点
tail = p; // 更新尾指针
scanf("%d", &x);
}
return L; // 返回头结点
}
// 打印单链表
void PrintList(LinkList L) {
LNode *p = L->next; // 跳过头结点
printf("链表元素:");
while (p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
LinkList L = CreateList_Tail(); // 创建链表
PrintList(L); // 打印链表
return 0;
}