数据结构每日一题day13(链表)★★★★★
题目描述:采用尾插法在头指针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)
代码实现:
#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初始化为NULLLNode *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为NULLtail->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;
}