链表是数据结构入门的一章,本文将基于不同的创建方式进行链表的基础操作。
1.常见的创建方法(定义结构体)
typedef struct LinkNode{
int val;
struct LinkNode* next;
}Node; // typedef只是一个重命名操作,不用也不影响
上面一段代码就是链表结点的常用定义,其实链表就是许多个这样的结点串在一起
就像这样,当然头结点其实可有可无,我喜欢加上头结点(这样可以避免一些繁琐操作),需要注意的是 Leetcode里面头结点是有值的,或者说LeetCode里面没有使用头结点。
接下来介绍链表的增删改查四个操作
1.1插入结点
Node* insert_front(Node* head, int x){
// 一般头插法就可以解决问题
// x为要插入的值
Node* node = new Node;
node->val = x;
node->next = head->next;
head->next = node;
return head;
}
1.2删除结点
Node* delete_k(Node* head, int k)
{
// 删除第k个结点
int cnt = 0;
Node* node = head;
while(node && cnt < k){
Node* backup = node; // 保留上一个结点
node = node->next;
}
if(!node){
cout << "error" << endl;
return NULL;
}
backup->next = node->next; // 直接让上一个结点的next指向这个结点的next就好
free(node);
return head;
}
1.3查找结点
Node* find_x(Node* head, int x)
{
// 查找值为x的结点
Node* node = head->next;
while(node){
if(node->val == x) break;
else node = node->next;
}
if(!node){
cout << "error" << endl;
return NULL;
}else return node;
}
改变结点的值较为简单,在此不再赘述,如果有用的话,会将数组模拟链表的方法发出来供大家参考。