链表基础知识回顾
1. 带头结点/不带头结点
初始化时:
带头:L->next=NULL;
不带头:L=NULL;
2. 链表类型
1.单链表
2.双链表
3.循环链表
3. 存储方式
1.静态存储(定义一整片连续空间)
2.动态存储
4. 链表节点定义
- 法1
// 单链表
struct ListNode {
int val; // 节点上存储的元素
ListNode *next; // 指向下一个节点的指针
ListNode(int x) : val(x), next(NULL) {} // 节点的构造函数
};
- 注意:不定义构造函数是可以的,C++默认生成一个构造函数。但是这个构造函数不会初始化任何成员变量。
- 通过自己定义构造函数初始化节点:
ListNode* head = new ListNode(5);
- 使用默认构造函数初始化节点:
ListNode* head = new ListNode();
head->val = 5;
所以如果不定义构造函数使用默认构造函数的话,在初始化的时候就不能直接给变量赋值!
- 法2
// 单链表
typedef struct LinkNode{
ElemType data;
LinkNode *next;
}LinkNode;
5. 基本操作
a) 带头节点
- 初始化
//定义单链表节点
typedef struct LinkNode
{
int data;
struct LinkNode* next;
} LinkNode;
//初始化一个带头结点的链表
void InitList(LinkNode*& L)
{
L = (LinkNode*)malloc(sizeof(LinkNode));
L->next = NULL;
}
- 头插法建立单链表,从键盘中输入
//头插法,键盘输入的方式建立链表
void InsertLink_byhead(LinkNode*& L)
{
LinkNode* s;
int x, length;
printf("请输入你要插入元素个数:\n");
scanf("%d", &length);
printf("请输入元素:\n");
for (int j = 0; j < length; j++)
{
s = (LinkNode*)malloc(sizeof(LinkNode));
scanf("%d", &x);
s->data = x;
s->next = L->next;
L->next = s;
}
}
- 尾插法建立单链表,从键盘中输入
//尾插法,键盘输入的方式建立链表
void InsertLink_bytail(LinkNode*& L)
{
LinkNode* s, * p;
p = L;
int x, length;
printf("请输入你要插入的元素个数:\n");
scanf("%d", &length);
printf("请输入元素:\n");
for (int j = 0; j < length; j++)
{
s = (LinkNode*)malloc(sizeof(LinkNode));
scanf("%d", &x);
s->data = x;
p->next = s;
p = s;
}
p->next = NULL;//最后置为空
}
- 输出单链表元素
//输出单链表
void PrintLinkNode(LinkNode*& L)
{
LinkNode* s = L->next;
printf("单链表元素如下:\n");
while (s != NULL) {
printf("%d ", s->data);
s = s->next;
}
printf("\n");
}
b) 带头节点
1.初始化
1. 初始化
//定义单链表节点
typedef struct LinkNode
{
int data;
struct LinkNode* next;
} LinkNode;
//初始化链表,不带头节点
void InitLinkList(LinkNode*& L)
{
L = NULL;
}
- 头插法建立单链表,不带头节点
//头插法建立单链表,不带头节点
void InsertList_byhead2(LinkNode*& L)
{
int len, x;
LinkNode* p;
printf("请输入您要插入的元素个数\n");
scanf("%d", &len);
printf("请输入元素:\n");
for (int j = 0; j < len; j++)
{
p = (LinkNode*)malloc(sizeof(LinkNode));
scanf("%d", &x);
p->data = x;
p->next = L;
L = p;
}
}
- 尾插法建立单链表,不带头节点
//尾插法建立单链表,不带头节点
void InsertList_bytail2(LinkNode*& L)
{
int len, x;
LinkNode* p, * s;
s = L;
printf("请输入您要插入的元素个数\n");
scanf("%d", &len);
printf("请输入元素:\n");
for (int j = 0; j < len; j++)
{
p = (LinkNode*)malloc(sizeof(LinkNode));
scanf("%d", &x);
p->data = x;
if (L == NULL)
{
L = p;
s = p;
}
else
{
s->next = p;
s = p;
}
s->next = NULL;
}
s->next = NULL;
}
- 注意,第一个元素插入时需要判断
if (L == NULL)
{
L = p;
s = p;
}