【算法入门&链表】【模板】链表|反转链表|合并排序链表|删除链表的节点(上)

简介: 【算法入门&链表】【模板】链表|反转链表|合并排序链表|删除链表的节点

🔥前言

本专栏收录的均为牛客网的算法题目,内含链表、双指针、递归、动态规划、基本数据结构等算法思想的具体运用。牛客网不仅有大量的经典算法题目,也有大厂的面试真题,面试、找工作完全可以来这里找机会。此外,网站内的编码主题多样化,调试功能可运用性强,可谓是非常注重用户体验。这么好的免费刷题网站还不快入手吗,快去注册开启算法百炼成神之路吧!


1、AB9【模板】链表

题目链接:点击即可挑战


考查链表的设计,插入,删除操作,做的时候考虑链表尾部的特殊处理,锻炼思维能力


题目描述:


d25104082b364567a42605955aa3d006.png


1.1、解题思路

对于模板链表题,只需按照平常学习的知识构建普通单向有头结点的链表即可:


insert和delete方法都需要判断链表中是否有值为x的结点,那么可以单独写一个函数来判断

对于插入和删除操作我都是采用的两个移动指针的方法:ptr在前,pre在后

对于此题来说最后不能输出空格,因此要加条件限制

1.2、代码实现及注释

本题源码:

#include <iostream>
using namespace std;
struct list {
    int data;
    list* next;
};
bool judge(list* &L, int x) {
    list* ptr = L->next;
    while (ptr) {
        if (ptr->data == x)
            return true;
        else
            ptr = ptr->next;
    }
    return false;
}
int main() {
    list* L = (list*)malloc(sizeof(list));
    L->next = NULL;
    int n;
    cin >> n;
    for (int i = 0; i < n; i++) {
        string s;
        cin >> s;
        if (s == "insert") {
            list* ptr = L->next;
            list* pre = L;
            int x, y;
            cin >> x >> y;
            list* e = (list*)malloc(sizeof(list));
            e->next = NULL;
            e->data = y;
            if (judge(L, x)) {
                while (ptr) {
                    if (ptr->data == x) {
                        pre->next = e;
                        e->next = ptr;
                        break;
                    } else {
                        pre = ptr;
                        ptr = ptr->next;
                    }
                }
            } else {
                while (pre->next) {
                    pre = pre->next;
                }
                pre->next = e;
            }
        } else if (s == "delete") {
            int x;
            cin >> x;
            list* ptr = L->next;
            list* pre = L;
            if (judge(L, x)) {
                while (ptr) {
                    if (ptr->data == x) {
                        if (ptr->next) {
                            pre->next = ptr->next;
                            ptr = NULL;
                            free(ptr);
                            break;
                        } else {
                            pre->next = NULL;
                            ptr = NULL;
                            free(ptr);
                            break;
                        }
                    } else {
                        pre = ptr;
                        ptr = ptr->next;
                    }
                }
            }
        }
    }
    list* ptr = L->next;
    if (ptr == NULL) cout << "NULL";
    else {
        while (ptr) {
            cout << ptr->data << " ";
            ptr = ptr->next;
        }
    }
}

重要注释:


judge函数返回一个布尔类型,为true则链表存在x,为false则不存在x

对于insert操作:

若存在x, 指针pre和ptr逐步遍历,直到ptr指向结点的值为x,将新结点e添加到链表中

若不存在x,让pre指针循环后移到最后一个结点位置,然后将e插入到pre指向的结点后

对于delete操作:

在存在x的情况下,判断其是否在链表的末尾:

若不在链表末尾:让pre指向ptr的下一个结点,删除并释放ptr

若在链表末尾:直接删除并释放ptr指针即可

若不存在x,不进行任何操作

最后就是对链表的内容进行输出:注意输出空格的时候要再链表非末尾的情况下进行


目录
相关文章
|
2月前
|
存储 算法
算法入门:专题二---滑动窗口(长度最小的子数组)类型题目攻克!
给定一个正整数数组和目标值target,找出总和大于等于target的最短连续子数组长度。利用滑动窗口(双指针)优化,维护窗口内元素和,通过单调性避免重复枚举,时间复杂度O(n)。当窗口和满足条件时收缩左边界,更新最小长度,最终返回结果。
|
3月前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】基于非支配排序的鲸鱼优化算法NSWOA与多目标螳螂搜索算法MOMSA求解无人机三维路径规划研究(Matlab代码实现)
223 5
|
3月前
|
机器学习/深度学习 运维 算法
基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
263 0
基于非支配排序遗传算法NSGAII的综合能源优化调度(Matlab代码实现)
|
3月前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】多目标螳螂搜索算法MOMSA与非支配排序的鲸鱼优化算法NSWOA求解无人机三维路径规划研究(Matlab代码实现)
181 0
|
2月前
|
存储 算法
算法入门:专题一:双指针(有效三角形的个数)
给定一个数组,找出能组成三角形的三元组个数。利用“两边之和大于第三边”的性质,先排序,再用双指针优化。固定最大边,左右指针从区间两端向内移动,若两短边之和大于最长边,则中间所有组合均有效,时间复杂度由暴力的O(n³)降至O(n²)。
|
2月前
|
存储 算法 编译器
算法入门:剑指offer改编题目:查找总价格为目标值的两个商品
给定递增数组和目标值target,找出两数之和等于target的两个数字。利用双指针法,left从头、right从尾向中间逼近,根据和与target的大小关系调整指针,时间复杂度O(n),空间复杂度O(1)。找不到时返回{-1,-1}。
|
3月前
|
供应链 算法 Java
【柔性作业车间调度问题FJSP】基于非支配排序的多目标小龙虾优化算法求解柔性作业车间调度问题FJSP研究(Matlab代码实现)
【柔性作业车间调度问题FJSP】基于非支配排序的多目标小龙虾优化算法求解柔性作业车间调度问题FJSP研究(Matlab代码实现)
148 1
|
3月前
|
机器学习/深度学习 算法 安全
【无人机三维路径规划】基于非支配排序的鱼鹰优化算法NSOOA求解无人机三维路径规划研究(Matlab代码实现)
【无人机三维路径规划】基于非支配排序的鱼鹰优化算法NSOOA求解无人机三维路径规划研究(Matlab代码实现)
114 0
|
存储 SQL 算法
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
LeetCode力扣第114题:多种算法实现 将二叉树展开为链表
|
存储 SQL 算法
LeetCode 题目 86:分隔链表
LeetCode 题目 86:分隔链表