前言
今日不更题,今日的内容是对前面一周的学习内容进行总结。
一、链表的创建
对于链表的创建,我一般是先建立一个结构体,里面包括需要存储的数据和准备使用来指向下一结点的指针;然后就开始创建链表,创建链表时我习惯创建一个函数作为载体,一般先初始化头部和尾部的指针,使链表为空,然后循环创建新的结点。
typedef struct LNode{
TElemType data;
struct LNode *next;
} LNode, *LinkList;//创建结构体
LinkList createList(int count) {//创建链表
LinkList head = nullptr, tail = nullptr;
for (int i = 0; i < count; ++i) {循环读取输入
int id, score;
cin >> id >> score;
LNode* t = new LNode;
t->Student_Number = id;
t->score = score;
t->next = nullptr;//创建新的结点
return head;
}
这个插入操作的总时间复杂度时是O(n),return的头指针可以后续调用它遍历链表
二、链表的插入
链表的插入有两种情况,分别是头插法和尾插法;
头插法:
图解如下:
//核心代码
p->next = head->next;
head->next = node;
尾插法:
图解如下:
//核心代码
t->next = node;
t= node;
插入链表的方法是动态生成一个新的结点,然后通过改变指针的指向和取缔原来那个结点之间的连接来实现插入操作。
三、链表的删除
链表的删除有按位删除和指定位置删除两种。
按位删除:
核心代码
LNode *q = p->next;
t = q->data;
p->next = q->next;
free(q);
指定位置删除:
核心代码
LNode *e = p->next;
p->data = p->next->data;
p->next = e->next;
free(p)
图解如下:
删除操作我都使用了free,它的作用是释放被删除节点的内存
四、链表的查找
链表的查找就相对容易许多,只需要定义指针,然后依次遍历各个结点即可。
核心代码
LinkList p=head;
int j=0;
while(p->next && j<i)
{
p=p->next;
j++;
}
if(j==i)
{
return p;
}
else{
return nullptr;
}
图解如下:
在循环遍历的过程中要注意判断是否存在越界的问题。
总结
以上就是这周对于链表的学习,双向链表和循环链表的思想和它类似,就是写对应代码的过程中要注意逻辑正确。下周在复习链表的基础上还会继续往下更进新的数据结构算法。