最近一直在用python等,很久没写过C了hhh,,突然心血来潮,想要巩固下基础,写一波对于链表操作的简单复现,就当是一个练手或者复习吧,,对于链表使用不是很熟的xdm可以大致参照下,有问题也欢迎各位大佬批评指正
(本文以代码部分为主,详细的链表原理部分可移步至其它视频/文章,笔者也会考虑在以后有机会更一篇原理讲解hhh)
这里均以最简单的结构(数据+地址指针)为例定义链表节点。
struct node{
int data; // 数据域
node* next = nullptr; // 指针域
};
// 创建节点head
node* head = new node;
// 链表长度
int node_length(node* head){
node* p = head;
int length = 0;
while(p){
length++;
p = p->next;
}
return length;
}
这里是直接封装成尾插函数,由于单链表在插入节点前需要确定前驱节点的位置,因而这里,如果要每次尾插入一个节点,都需要从头节点开始遍历至末尾确认当前前驱节点,时间复杂度为 O ( n ) O(n) O(n)。
// 尾插法插入元素
void insert_at_tail(node* head, int dat){
node* point = new node;
point -> data = dat;
node* p = head;
while(p -> next != nullptr){
p = p -> next;
}
p -> next = point;
point -> next = nullptr;
}
不同于尾插法,头插法只需知道头节点的位置即可,直接将新节点插入头节点后继即可,时间复杂度为 O ( 1 ) O(1) O(1)。
// 头插法插入元素
void insert_at_head(node* head, int dat){
node* point = new node;
point -> data = dat;
// 若只有头节点,直接插入
if(head -> next == nullptr){
head -> next = point;
point -> next = nullptr;
return;
}
else{
node* p = head -> next;
point -> next = p;
head -> next = point;
}
}
相对于前面插入方法,这里需要输入插入元素的位置信息。
// 在指定位置插入元素,loc为插入位置的索引
void insert_at_loc(node* head, int loc, int dat){
// 插入位置合理性判断,这里用到了求链表长度函数
if(loc < 0 || loc >= node_length(head)) return;
node* p = head;
for(int i = 0;i < loc;i++){
p = p -> next;
}
node* point = new node;
point -> data = dat;
point -> next = p -> next;
p -> next = point;
}
若找到要删除的值,则在链表中删除该值对应节点,未找到则不做操作。
// 删除指定值元素, 若未找到指定值则原封不动
void delete_node(node* head, int dat){
node* p = head;
node* q = head -> next;
while(q){
if(q -> data == dat){
p -> next = q -> next;
delete(q);
break;
}
else{
if(q -> next == nullptr && q -> data != dat) return;
p = p -> next;
q = q -> next;
}
}
}
将指定元素的节点值修改为新的指定值,若未找到指定元素则原封不动。
// 将指定元素的节点值修改为新的指定值,若未找到指定元素则原封不动
void revise(node* head, int src, int dst){
node* p = head;
while(p){
if(p -> data == src){
p -> data = dst;
return;
}
else{
if(p -> next == nullptr && p -> data != src) return;
p = p -> next;
}
}
}
输出指定元素值的位置,若未找到返回-1。
// 输出指定元素值的位置,若未找到返回-1
int find_node(node* head, int dat){
if(head -> next == nullptr)return -1;
node* p = head;
int loc = 0;
while(p){
if(p -> data == dat)return loc;
else{
if(p -> next == nullptr && p -> data != dat) return -1;
p = p -> next;
loc++;
}
}
}