提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
一、单向链表
链表的定义
struct ListNode {
int val;
struct ListNode *next;
};
初始化链表
struct ListNode* initLink() {
//创建头节点
struct ListNode *header = malloc(sizeof(struct ListNode));
header->val = -1;
header->next = NULL;
//创建尾指针
struct ListNode *pRear = header;
for (int i = 1; i < 5; i++)
{
//创建新的节点
struct ListNode *newnode = malloc(sizeof(struct ListNode));
newnode->val = i;
newnode->next = NULL;
if (i == 1) {
header->val = i;
}
else {
pRear->next = newnode;
pRear = newnode;
}
}
return header;
}
遍历链表
void printlist(struct ListNode *header) {
if (NULL == header)
{
return;
}
struct ListNode *pCurrent = header;
while (pCurrent) {
printf("%d\n", pCurrent->val);
pCurrent=pCurrent->next;
}
}
获取链表长度
int getListNodeLength(struct ListNode *header) {
if (NULL == header)
{
return 0;
}
int length = 0;
struct ListNode *pCurrent = header;
while (pCurrent != NULL) {
length++;
pCurrent = pCurrent->next;
}
return length;
}
插入链表
struct ListNode* insertListNode(struct ListNode* header, struct ListNode* insertNode, int pos) {
// 判断链表是否为空
if (NULL == header) {
// 为空直接返回插入链表
return insertNode;
}
// 获取链表长度
int size = getListNodeLength(header);
// 判断插入的链表的位置是否越界
if (pos > size + 1 || pos < 1) {
printf("位置越界");
return header;
}
// 头插
if (pos == 1) {
// 判断插入链表是否为空
if (insertNode == NULL) {
printf("插入节点为空");
return header;
}
// 让插入链表指针指向下一个节点
insertNode->next = header;
// 更换头节点的数据
header = insertNode;
return header;
}
struct ListNode* pNode = header;
int count = 1;
// 循环找到插入前一个节点
while (count < pos - 1 && pNode != NULL) {
pNode = pNode->next;
count++;
}
// 判断当前节点是否为空
if (pNode == NULL) {
printf("插入位置越界");
return header;
}
// 判断插入节点是否为空
if (insertNode == NULL) {
printf("插入节点为空");
return header;
}
// 插入的节点指向下一个节点
insertNode->next = pNode->next;
// 插入前一个的节点指向插入的节点
pNode->next = insertNode;
return header;
}
链表删除
struct ListNode* deleteNode(struct ListNode* header, int pos) {
if (NULL == header) {
return NULL;
}
int size = getListNodeLength(header);
if (pos > size || pos < 1) {
printf("位置越界");
return header;
}
if (pos == 1) {
return header->next;
}
else
{
//俩个辅助指针
struct ListNode *pNode = header;
struct ListNode *pCurrent = pNode->next;
int count = 1;
// 循环找到插入前一个节点
while (count < pos - 1 && pNode != NULL) {
pNode = pNode->next;
count++;
}
//重新建立待删除节点的前驱和后继结点关系
pNode->next = pCurrent->next;
//释放删除节点内存
free(pCurrent);
pCurrent = NULL;
}
}
二、链表增加元素,首部,中部,尾部会出现的问题,怎么处理
增加元素到首部,头节点就要更换
增加元素要变更为头节点,并指向下一个节点
增加元素到中部,增加元素的前一个节点指向会出问题
前一个节点指向增加元素,增加元素的节点再指向前面的节点
增加元素到尾部,前一个节点指向是空,
前一个节点指向增加元素,增加元素指向空