链表 算法

# 链表
    1: C++ 使用的链表的数据结构
         ListNode* head
            head->val : 值域
            head->next: 指针域


    2: 链表创建哑节点
        ListNode* dummy = new ListNode(-1);


    3: 链表中创建一个游标去遍历链表元素
        ListNode* cur = head; // 先指向当前链表的头节点
        cur = cur->next; // 游标移动
        遍历结束条件是非空: while(cur) {}


    4: 删除链表操作 node->val = 0; node->next = nullptr; free(node);


    5: 打印链表元素
        从头到尾打印链表元素: 遍历链表每个节点,找个数组存放每个节点数据。之后打印数组元素。
        从尾到头打印链表元素: 从尾到头,栈先进后出。 遍历链表,找个栈存放节点数据,之后打印栈元素。


    6: 环
         约瑟夫环: cur指向头节点,找到目标节点后,删除节点。更新新的头节点head,cur重新指向新的头节点。
         链表是否带环
            (1) 使用快慢指针,当快慢指针相遇时候就说明有
         链表环的入口
            (1) 使用快慢指针,当两者相遇。 一个重新开始一步步走,一个从相遇点开始走,当再次相遇就为环的入口。


    7: 链表反转问题 (需要一个pre 前驱节点)
        模版
ListNode* reverse_listnode(ListNode* pre, ListNode* tail)
{
    // 注意这种方法 要求pre 不能为空 pre = dummy 
    // 参数为前驱 和 后继
    // pre不动
    ListNode* cur_pre = pre; // cur_pre为移动的pre
    ListNode* cur = cur_pre->next; // cur 指向当前等待翻转的第一个元素

    // 翻转
    ListNode* tmp = nullptr;
    while (cur != tail) {
        tmp = cur->next; // 存放下个节点
        cur->next = cur_pre; // 修改指向
        cur_pre = cur; // 当前前驱
        cur = tmp; // 移动到下个待翻转的节点
    }

    // 翻转后的结果
    ListNode* new_tail = pre->next; // 新的尾
    new_tail->next = tail; // 新的尾指向当前cur (或者写为 pre->next->next = tail) 当前cur 指向了当前后驱tail
    ListNode* new_head = cur_pre;  // 新的头
    pre->next = new_head; // 前驱指向新的头

    return new_tail; // 返回新的尾部
    // return new_head; // 返回新的头部
}


    8: 链表双指针问题(快慢指针问题: (1)求是否为环, (2)求环的起点, (3)求倒数第k个节点) (4)链表的中间节点
        模版

case 1/2:
// 快慢指针从相同的起点开始,每次快都是慢的2倍。(每次多走一步)
// 结束遍历条件是快指针结束, 指向nullptr.
ListNode* slow = head;
ListNode* fast = head;
while (fast != nullptr) { // 快指针还没有结束
    slow = slow->next;
    fast = fast->next;
    if (fast->next != nullptr) {
        fast = fast->next; // 快指针多走一步
    } else {
        // (1) return false; // 不是环
        // (2) return nullptr; // 不是环 找不到环的起点
    }

    // 快慢指针两者相遇
    if (fast == slow){
        // (1)return true; // 是环
        // (2)求环的起点
        while (cur != slow) {
            slow = slow->next;
            cur = cur->next;
        }
        return slow; // 返回环的起点
    } 
}

case 3
// 快指针先领先慢指针k步。之后两者一起移动。
// 遍历结束条件是快指针结束,指向nullptr
ListNode* slow = head;
ListNode* fast = head;
int i = 0;
while (i < k) {
    fast = fast->next
    i++;
    if (i != k && fast == nullptr) {
        return slow; // 没有移动完 就遍历结束 所以不存在倒数第个节点
    } else if (i == k && fast == nullptr) {
       return slow->next; // 头节点就是倒数第k个节点 之后返回头节点的下一个节点,实现删除目标节点
    }
    // 继续
}
ListNode* pre = nullptr;
while(fast) { //fast
    pre = slow;
    slow = slow->next;
    fast = fast->next;
}
pre->next = slow->next; //实现删除slow

case 4 (当都指向head 那么就是偶数中心的后者)(都指向pre 就是指向中心的前者)
ListNode* slow = head;
ListNode* fast = head;
while (fast != nullptr && fast->next != nullptr) {
    slow = slow->next;
    fast = fast->next->next;
}
return slow; // 返回中间节点

链表leetcode:
(1) 反转链表
https://leetcode.cn/problems/reverse-linked-list/

(2) 反转链表
https://leetcode.cn/problems/reverse-linked-list-ii/

(3) 两两交换链表中的节点
https://leetcode.cn/problems/swap-nodes-in-pairs/

(4) k个一组交换链表节点
https://leetcode.cn/problems/reverse-nodes-in-k-group/

(5) 回文链表
https://leetcode.cn/problems/palindrome-linked-list/
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/1172.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯嵌入式第四课--定时器

前言蓝桥杯对于定时器这部分的考察主要集中在定时器中断、PWM输出以及输入捕获三个方面&#xff0c;本节课着眼于应用&#xff0c;介绍一下定时器的使用。定时器中断一、基础概念对没接触过定时器的新手来说&#xff0c;如果想要快速上手定时器的使用&#xff0c;首先要先对定时…

Python每日一练(20230318)

目录 1. 排序链表 ★★ 2. 最长连续序列 ★★ 3. 扰乱字符串 ★★★ &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 排序链表 给你链表的头结点 head &#xff0c;请将其按 升序 …

卷积神经网络CNN识别MNIST数据集

这次我们将建立一个卷积神经网络&#xff0c;它可以把MNIST手写字符的识别准确率提升到99%&#xff0c;读者可能需要一些卷积神经网络的基础知识才能更好的理解本节的内容。 程序的开头是导入TensorFlow&#xff1a; import tensorflow as tf from tensorflow.examples.tutor…

C语言老题新解16-20 用命令行打印一些图案

文章目录11 打印字母C12 输出国际象棋棋盘。13 打印楼梯&#xff0c;同时在楼梯上方打印两个笑脸。14 输出9*9 口诀。15 有一道题要输出一个图形&#xff0c;然后Very Beautiful。11 打印字母C 11 用*号输出字母C的图案。 讲道理这绝对不该是个新人能整出来的活儿&#xff0c…

TCP/IP协议栈之数据包如何穿越各层协议(绝对干货)

所有互联网服务&#xff0c;均依赖于TCP/IP协议栈。懂得数据是如何在协议栈传输的&#xff0c;将会帮助你提升互联网程序的性能和解决TCP相关问题的能力。 我们讲述在Linux场景下数据包是如何在协议层传输的。 1、发送数据 应用层发送数据的过程大致如下&#xff1a; 我们把…

蓝桥杯嵌入式第五课--输入捕获

前言输入捕获的考题十分明确&#xff0c;就是测量输入脉冲波形的占空比和频率&#xff0c;对我们的板子而言&#xff0c;就是检测板载的两个信号发生器产生的信号&#xff1a;具体来说就是使用PA15和PB4来做输入捕获。输入捕获原理简介输入捕获能够对输入信号的上升沿和下降沿进…

WorkTool企微机器人接入智能问答

一、前言 最新版的企微机器人已经集成 Chat &#xff0c;无需开发可快速搭建智能对话机器人。 从官方介绍看目前集成版本使用模型为 3.5-turbo。 二、入门 创建 WorkTool 机器人 你可以通过这篇快速入门教程&#xff0c;来快速配置一个自己的企微机器人。 实现的流程如图&…

Windows与Linux端口占用、查看的方法总结

Windows与Linux端口占用、查看的方法总结 文章目录Windows与Linux端口占用、查看的方法总结一、Windows1.1Windows查看所有的端口1.2查询指定的端口占用1.3查询PID对应的进程1.4查杀死/结束/终止进程二、Linux2.1lsof命令2.2netstat命令一、Windows 1.1Windows查看所有的端口 …

基于GPT-4的免费代码生成工具

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

SpringCloud五大核心组件

Consul 等&#xff0c;提供了搭建分布式系统及微服务常用的工具&#xff0c;如配置管理、服务发现、断路器、智能路由、微代理、控制总线、一次性token、全局锁、选主、分布式会话和集群状态等&#xff0c;满足了构建微服务所需的所有解决方案。 服务发现——Netflix Eureka …

7个最受欢迎的Python库,大大提高开发效率

当第三方库可以帮我们完成需求时&#xff0c;就不要重复造轮子了 整理了GitHub上7个最受好评的Python库&#xff0c;将在你的开发之旅中提供帮助 PySnooper 很多时候时间都花在了Debug上&#xff0c;大多数人呢会在出错位置的附近使用print&#xff0c;打印某些变量的值 这个…

算法竞赛必考算法——动态规划(01背包和完全背包)

动态规划(一) 目录动态规划(一)1.01背包问题1.1题目介绍1.2思路一介绍(二维数组)1.3思路二介绍(一维数组) 空间优化1.4思路三介绍(输入数据优化)2.完全背包问题2.1题目描述&#xff1a;2.2思路一(朴素算法)2.3思路二(将k优化处理掉)2.4思路三(优化j的初始条件)总结1.01背包问题…

Spring Cloud Alibaba全家桶(四)——微服务调用组件Feign

前言 本文小新为大家带来 微服务调用组件Feign 的相关知识&#xff0c;具体内容包含什么是Feign&#xff0c;Spring Cloud Alibaba快速整合OpenFeign&#xff0c;Spring Cloud Feign的自定义配置及使用&#xff08;包括&#xff1a;日志配置、契约配置、自定义拦截器实现认证逻…

Autosar-ComM浅谈

文章目录 一、ComM概述二、和其他模块的依赖关系三、ComM通道状态机ComM模式与通讯能力关系表四、ComM中的PNC一、ComM概述 ComM全称是Communication Manager,顾名思义就是通信的管理,是BSW(基本软件)服务层的一个组件。 ComM的作用: 为用户简化Communication Stack的使用…

中断控制器

在Linux内核中&#xff0c;各个设备驱动可以简单地调用request_irq&#xff08;&#xff09;、enable_irq&#xff08;&#xff09;、disable_irq&#xff08;&#xff09;、 local_irq_disable&#xff08;&#xff09;、local_irq_enable&#xff08;&#xff09;等通用API来…

STM32----MPU6050

前言&#xff1a;最近几个月没有写文章了&#xff0c;因为这学期的事情真的有点多&#xff0c;但是想了想&#xff0c;文章还是要更新&#xff0c;总结自己学习的知识&#xff0c;真的很重要&#xff01;&#xff01;&#xff01; 废话不多说&#xff0c;正文开始&#xff1a;…

【vue.js】在网页中实现一个金属抛光质感的按钮

文章目录前言效果电脑效果手机效果说明完整代码index.html前言 诶&#xff1f;这有一个按钮(&#xff5e;&#xffe3;▽&#xffe3;)&#xff5e;&#xff0c;这是一个在html中实现的具有金属质感并且能镜面反射的按钮~ 效果 电脑效果 手机效果 说明 主要思路是使用 navig…

【算法基础】二分图(染色法 匈牙利算法)

一、二分图 1. 染色法 一个图是二分图,当且仅当,图中不含奇数环。在判别一个图是否为二分图⑩,其实相当于染色问题,每条边的两个点必须是不同的颜色,一共有两种颜色,如果染色过程中出现矛盾,则说明不是二分图。 for i = 1 to n:if i 未染色DFS(i, 1); //将i号点染色未…

Leetcode138. 复制带随机指针的链表

复制带随机指针的链表 第一步 拷贝节点链接在原节点的后面 第二步拷贝原节点的random &#xff0c; 拷贝节点的 random 在原节点 random 的 next 第三步 将拷贝的节点尾插到一个新链表 ,并且将原链表恢复 从前往后遍历链表 ,将原链表的每个节点进行复制&#xff0c;并l链接到原…

【STL二】STL序列式容器(array、vector、deque、list、forward_list)

【STL二】STL序列式容器&#xff08;array、vector、deque、list、forward_list&#xff09;1.array<T,N>&#xff08;数组容器&#xff09;2.vector<T>&#xff08;向量容器&#xff09;3.deque<T>&#xff08;双端队列容器&#xff09;&#xff1a;4.list&…
最新文章