当前位置: 首页 > news >正文

【算法学习之路】7.链表算法

链表算法

  • 前言
  • 一.原地逆置
    • 思路一:头插法
    • 思路二:双指针法
    • 思路3:递归
  • 例题:
    • 1.头插法
    • 2.双指针法
    • 3,递归
  • 二.双指针
    • 快慢指针:一个指针快一个指针慢
      • 例题1
      • 例题2

前言

我会将一些常用的算法以及对应的题单给写完,形成一套完整的算法体系,以及大量的各个难度的题目,目前算法也写了几篇,题单正在更新,其他的也会陆陆续续的更新,希望大家点赞收藏我会尽快更新的!!!

一.原地逆置

思路一:头插法

若带头节点,先将头节点摘下来
然后从第一个节点开始,挨个插入每一个节点
摘下来后用头插法建立新的链表

思路二:双指针法

定义两个指针pre和cur,pre在前cur在后
每次让pre的next指向cur,实现一次局部反转
局部反转之后。pre和cur同时往后移动一个位置,循环上述过程,直至pre到达链表尾部(在循环过程中需要记录pre->next)

思路3:递归

递归出口:传进来的节点p的next = NULL
递归体:递归调用,把p之后的先反转

例题:

力扣206. 反转链表
在这里插入图片描述

1.头插法

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 //头插法
struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode* p = head;
    if(head == NULL){//先判断是否为空
        return NULL;
    }
    struct ListNode* q = p->next;
    head = NULL;
    //将节点从链表拿下来
    while(q != NULL){
        p->next = head;
        head = p;
        p = q;
        q = q->next;
    }
    p->next = head;
    return p;
}

2.双指针法

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 //双指针法
struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode* p = head;//指向头节点
    struct ListNode* q = NULL;//指向头节点的上一个节点
    while(p != NULL){//
        struct ListNode* t = p->next;//保存p->next
        p->next = q;
        q = p;
        p = t;
    }
    return q;
}

3,递归

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 //递归
struct ListNode* reverse (struct ListNode* cur, struct ListNode* pre);
 
 
 
struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode* cur = head;
    struct ListNode* pre = NULL;
    return reverse (cur, pre);
}


struct ListNode* reverse (struct ListNode* cur, struct ListNode* pre){
    if (cur == NULL) {
        return pre;
    }else {
        struct ListNode* tmp = cur -> next;
        cur -> next = pre;
        return reverse (tmp, cur);
    }
}

二.双指针

快慢指针:一个指针快一个指针慢

例题1

力扣LCR 140. 训练计划 II

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* trainingPlan(struct ListNode* head, int cnt) {
    struct ListNode* cur = head;
    struct ListNode* next = head;
    for(int i = 0; i < cnt; i++){
        next = next->next;
    }
    while(next){
        cur = cur->next;
        next = next->next;
    }
    return cur;
}

例题2

力扣142. 环形链表 II
在这里插入图片描述
找环开始节点慢指针每次走一个节点,快指针每次走两个节点,当相遇时,再来一个指针从头一个一个走。当与慢指针相遇的时候为开始节点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) {
    if(head == NULL || head->next == NULL || head->next->next == NULL){
        return NULL;
    }
    struct ListNode* s = head;
    struct ListNode* f = head;
     while(f != NULL){
        s = s->next;
        if(f->next == NULL){
            return NULL;
        }
        f = f->next->next;
        if(f == s){
            struct ListNode* t = head;
            while(t != s){
                t = t->next;
                s = s->next;
            }
            return t;
        }
    }
    return NULL;
      
}

未完待续……


文章转载自:

http://lNU7YYH3.pdghL.cn
http://9KICKpBi.pdghL.cn
http://KY8020JI.pdghL.cn
http://i46wfR96.pdghL.cn
http://Sogw1APJ.pdghL.cn
http://QerNwpT3.pdghL.cn
http://OPUHT6Th.pdghL.cn
http://9QIMLjtn.pdghL.cn
http://jt4oDolT.pdghL.cn
http://A0HWmNBp.pdghL.cn
http://Se5l6XuV.pdghL.cn
http://EyzgAIoW.pdghL.cn
http://8CqZ37mm.pdghL.cn
http://8QmuoofJ.pdghL.cn
http://EUD7DUnG.pdghL.cn
http://jYXkS9CU.pdghL.cn
http://S8t15rrn.pdghL.cn
http://YJH0A3aE.pdghL.cn
http://yt5cHSx2.pdghL.cn
http://xi55xhpZ.pdghL.cn
http://eRneVQ1G.pdghL.cn
http://nKtNXFdR.pdghL.cn
http://2nRJ7l4g.pdghL.cn
http://A1iFao6Z.pdghL.cn
http://nlYSVeuB.pdghL.cn
http://DAd2CgGN.pdghL.cn
http://cz3xBKif.pdghL.cn
http://evvV5erH.pdghL.cn
http://BNGpCEn2.pdghL.cn
http://8eHZVyX7.pdghL.cn
http://www.dtcms.com/a/57665.html

相关文章:

  • 【ESP-IDF】组件
  • 博弈论算法
  • Freertos卡在while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U )
  • windows下Jmeter的安装与使用
  • Refreshtoken 前端 安全 前端安全方面
  • Day4 C语言与画面显示练习
  • Linux文件打包与压缩
  • 深入剖析MyBatis缓存机制:原理、源码与实战指南
  • 更多文章请查看
  • Unity开发——CanvasGroup组件介绍和应用
  • Oracle 字符类型对比
  • IEC61499分布式编程与传统PLC分布式编程比较
  • IntersectionObserver接口介绍
  • 2025年2月平价旗舰手机性能对比
  • 大白话html第十三章HTML学习全文总结
  • 进程间通信(下)
  • Spring Boot 3 整合 MinIO 实现分布式文件存储
  • 算法 背包问题
  • 系统思考—组织诊断
  • Java EE 进阶:Spring MVC(2)
  • postgrel
  • Java学习--MySQL
  • leetcode日记(85)验证二叉搜索树
  • STM32 I2C驱动开发全解析:从理论到实战 | 零基础入门STM32第五十步
  • 蓝桥杯历年真题题解
  • 布朗运动(Brownian Motion):随机世界的舞者
  • C语言学习笔记-进阶(7)字符串函数3
  • 二分查找寻找旋转排序数组最小值边界条件处理
  • 【 <一> 炼丹初探:JavaWeb 的起源与基础】之 Servlet 过滤器:实现请求的预处理与后处理
  • 【GPT入门】第8课 大语言模型的自洽性