单向链表与双向链表

news2024/9/25 9:30:01

当使用单向链表查看链表中某个节点的数据,可以使用快慢指针法

快慢指针:

快慢指针是一种在链表和数组中常用的算法技巧,主要用于解决链表或数组中的问题,如检测环

存在、找到环的入口、计算链表的中点等。快慢指针的核心思想是使用两个指针以不同的速度遍

链表或数组:

>慢指针(Slow Pointer):每次移动一步。

>快指针(Fast Pointer):每次移动两步。

使用场景

检测链表是否有环
  1. 如果快指针最终追上慢指针,说明链表中有环。

  2. 如果快指针到达链表的末尾,说明链表中没有环。

bool HasCircle(Node *head)
{
  if(head == NULL)
    return false;
  Node *slow = head, *fast = head;
  while(fast != NULL && fast->next!=NULL)
  {
     slow = slow->next; //慢指针每次前进一步
     fast = fast->next->next;//快指针每次前进两步
     if(slow == fast) //相遇,存在环
         return true;
  }
  return false;
}
输出链表中的倒数第K个节点(即正数第K-1个节点)
Link_node_t * find_k_link(Link_t *plink,int key)
{
    Link_node_t *pfast = find_link(plink,key);
    if(NULL == pfast)
    {
        return NULL;
    }
    pfast = pfast->pnext;
    Link_node_t *pslow = plink->phead;
    while(pfast != NULL)
    {
        pfast = pfast->pnext;
        pslow = pslow->pnext;
    }
    return pslow;
}

单向链表倒置

int inver_link(Link_t *plink)
{
    int len = link_lenth(plink);
    if(len == 0)
    {
        return -1;
    }
    Link_node_t *ptemp = plink->phead;
    plink->phead = NULL;
    Link_node_t *pinsert = NULL;

    while(ptemp != NULL)
    {
        pinsert = ptemp;
        ptemp = ptemp->pnext;
        pinsert->pnext = plink->phead;
        plink->phead = pinsert;
    }

    return 0;
}

单向链表排序(插入法)

将待插入的数,插入到一个有序的序列中,使得到的序列仍然有序

void insert_sort(Link_t *plink)
{
    Link_node_t *ptemp = plink->phead->pnext;
    plink->phead->pnext = NULL;
    while(ptemp != NULL)
    {
        Link_node_t *pinsert = ptemp;
        ptemp = ptemp->pnext;
        Link_node_t *p = NULL;
        if(plink->phead->data > pinsert->data)
        {
            pinsert->pnext = plink->phead;
            plink->phead = pinsert;
        }
        else
        {
            p = plink->phead;
            while(p->pnext != NULL && p->pnext->data < pinsert->data)
            {
                p = p->pnext;
            }
            pinsert->pnext = p->pnext;
            p->pnext = pinsert;
        }
    }
}

valgrind

在使用和操作链表时,需注意内存泄漏的情况,可以使用Valgrind来检查内存泄漏的情况

Valgrind 是一个编程工具,主要用于内存调试、内存泄漏检测、以及性能分析。

使用场景

>内存泄漏检测:检查程序是否在不再需要时未能释放分配的内存。

>内存越界:检测数组越界、堆栈缓冲区溢出等错误。

>线程错误:检查多线程程序中的同步问题,如死锁、竞争条件等。

>性能分析:分析程序的性能瓶颈,如CPU周期使用、内存访问模式等。

安装valgrind

sudo apt-get update
sudo apt-get install valgrind

运行valgrind

valgrind [选项] 程序名 [程序参数]

使用示例:


双向链表

双向链表与单向链表的区别:

单向链表只有一个后继指针

对于单向链表的某一个节点,只能找到其后的节点,而不能找到之前的节点

基础操作

头插
int push_doulink_head(Dlink_t *plink,DataType data)
{
    Dlink_node_t *pdouble = malloc(sizeof(Dlink_node_t));
    if(NULL == pdouble)
    {
        return -1;
    }

    pdouble->data = data;
    pdouble->pnext = NULL;
    pdouble->ppre = NULL;

    if(is_empty_link(plink))
    {
        plink->phead = pdouble;
    }
    else
    {
        pdouble->pnext = plink->phead;
        plink->phead->ppre = pdouble;
        plink->phead = pdouble;
        
    }
    plink->clen++;
    return 0;
}
尾插
int push_doulink_end(Dlink_t *plink,DataType data)
{
    Dlink_node_t *pnode = malloc(sizeof(Dlink_node_t));
    if(NULL == pnode)
    {
        return -1;
    }

    pnode->data = data;
    pnode->ppre = NULL;
    pnode->pnext = NULL;

    if(is_empty_link(plink))
    {
        push_doulink_head(plink,data);
    }
    else
    {
        Dlink_node_t *p = plink->phead;
        while(p->pnext != NULL)
        {
            p = p->pnext;
        }
        p->pnext = pnode;
        pnode->ppre = p;
    }
    plink->clen++;
    return 0;
}
头删
int pop_link_head(Dlink_t *plink)
{
    Dlink_node_t *pnode = plink->phead;
    if(plink->phead ==NULL)
    {
        return 0;
    }
    else
    {
        Dlink_node_t *pdel = pnode;
        plink->phead = pnode->pnext;
        pnode->pnext->ppre = NULL;
        free(pdel);
    }
    plink->clen--;
    return 0;
}
尾删
int pop_link_end(Dlink_t *plink)
{
    Dlink_node_t *pnode = plink->phead;
    if(plink->phead == NULL)
    {
        return 0;
    }
    else if(pnode->pnext == NULL)
    {
        pop_link_head(plink);
    }
    else
    {
        while(pnode->pnext->pnext != NULL)
        {
            pnode = pnode->pnext;
        }
        pnode->pnext = NULL;
        free(pnode->pnext);
    }
    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【数学建模备赛】Ep07:灰色预测模型

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、&#xff1a;灰色预测模型☀️☀️☀️1. 灰色系统引入2. 方法3. 步骤① 累加法产生新序列② 利用部分和序列相邻两项的加权平均产生序列z③ 建立关于原始数据与序列z的灰微分方程④ 利用最小二乘法确定灰微分方程…

Orcad封装怎么添加

1 点击文件&#xff0c;添加库 2 添加封装 3 画二极管封装 1.先设置网格。 2..Library-->>olb文件 右键New Part 3.文件名建议规范命名。 4.place ployline 同时按shift画任意形状的封装 5 图形填充

18.求三数之和

题目 链接&#xff1a;leetcode链接 思路分析&#xff08;双指针&#xff09; 这道题目与上一道题&#xff0c;求有效三角形的个数&#xff0c;十分类似&#xff0c;都是使用双指针算法来解决问题。 先进行排序&#xff0c;然后利用单调性进行调整&#xff0c;逐步逼近正确…

25届计算机毕业设计,如何打造Java SpringBoot+Vue博客系统,一步一脚印,开发心得分享

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Proteus 仿真设计:开启电子工程创新之门

摘要&#xff1a; 本文详细介绍了 Proteus 仿真软件在电子工程领域的广泛应用。从 Proteus 的功能特点、安装与使用方法入手&#xff0c;深入探讨了其在电路设计、单片机系统仿真、PCB 设计等方面的强大优势。通过具体的案例分析&#xff0c;展示了如何利用 Proteus 进行高效的…

JVM垃圾回收算法:标记-清除算法 、复制算法、 标记-整理算法、 分代收集算法、可达性分析算法

文章目录 引言I 标记回收算法(Mark-Sweep)算法思路不足II 复制算法(Copying)算法的思路缺点案例III 标记整理算法(Mark-Compact)思路IV 分代收集(以上三种算法的集合体)分代收集算法思想新生代算法:Minor GC使用复制算法老年代 GC算法:(Major GC / Full GC)使用标记…

【内网渗透】最保姆级的春秋云镜Certify打靶笔记

目录 flag1 flag2 flag3 flag4 flag1 fscan扫外网 访问8983端口&#xff0c;发现配置项有log4j 【vulhub】Log4j2&#xff1a;CVE-2021-44228漏洞复现_vulhub cve-2021-44228-CSDN博客 /solr/admin/collections?action${jndi:ldap://z5o5w8.dnslog.cn} dnslog测出可…

【数据结构】详解二叉搜索树及其实现

前言&#xff1a; 二叉搜索树是红黑树等的前身&#xff0c;掌握其操作和性质很重要。总结自用and分享。 目录 一、基本概念 二、其常见操作及其实现 1.定义节点 2.查找元素 3.插入元素 4.删除元素【难点】 三、性质分析 一、基本概念 如下所示&#xff1a;对于所有节点都…

小阿轩yx-Kubernetes高级调度

小阿轩yx-Kubernetes高级调度 前言 前面 Kubernetes 的调度基础实现了见表格自己的服务器部署到 Kubernetes在生产环境中&#xff0c;调度远比想象的要复杂 比如 某些程序只能部署在固定的几台机器上某些机器只能部署指定的 Pod节点挂了怎么快速修复节点挂了如何让影响最小…

DDS基本原理--FPGA学习笔记

DDS信号发生器原理&#xff1a; timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 2024/09/04 15:20:30 // Design Name: hilary // Module Name: DDS_Module //module DDS_Module(Clk,Reset_n,Fword,Pword,Data);input Clk;input Reset_n;input [31:0]…

OpenBLAS QR decompose example

1. 安装 OpenBLAS release 版本&#xff1a; Makefile&#xff1a; all:wget https://github.com/OpenMathLib/OpenBLAS/archive/refs/tags/v0.3.27.tar.gztar zxf v0.3.27.tar.gz make -C OpenBLAS-0.3.27 FCgfortran -jinstall:make -C OpenBLAS-0.3.27 install PREFIX../lo…

字节跳动一面

字节跳动一面【C后端开发】 base &#xff1a; 深圳 岗位&#xff1a;C后端开发 时间&#xff1a; 2024/8/30 文章目录 基本介绍C语言1. 堆栈内存是否连续&#xff0c;为什么&#xff1f;2. int i0; i ; 两个线程同时执行10000次&#xff0c;i最终的数值是多少&#xff1f;3.…

【Java基础】代理

文章目录 代理代理模式的优点代理模式类型基于JDK的静态代理基于JDK的动态代理 代理 一种设计模式&#xff0c;不允许用户直接访问核心功能&#xff0c;而是通过代理来访问核心类的核心功能 举个例子&#xff0c;如果我们现在需要一个银行转账系统&#xff0c;我们需要在一个Ja…

git创建本地分支并track跟踪远程分支

git创建本地分支并track跟踪远程分支 查看本地分支与远程分支的映射关系&#xff1a; git branch -vv 查看远程都有什么分支&#xff1a; git branch -r 在本地自动新建一个xxx分支&#xff0c;且自动track跟踪远程的同名xxx分支&#xff1a; git checkout --track origin/xx…

MinIO Packet Pushers 播客: 汤姆-里昂,《NFS 必死》。

我们真的很喜欢 Packet Pushers 的团队。他们的播客是业内最好的播客之一&#xff0c;涵盖了从堆栈顶部到底部的技术。我们最近有机会赞助传奇人物 Tom Lyon 对 Ethan Banks 和 Drew Conry-Murray 的采访。Packet Pushers 的团队对 Tom 最近题为“NFS&#xff08;网络文件系统&…

数据结构(13)——平衡二叉树(红黑树)

欢迎来到博主的专栏——数据结构 博主ID&#xff1a;代码小号 文章目录 红黑树红黑树节点之间的关系红黑树的插入uncle节点为红色uncle节点是黑色或者没有uncle节点 红黑树 平衡二叉树最出名的除了AVL树之外就是红黑树&#xff08;RBTree&#xff09;&#xff0c;所谓红黑树&a…

JSON 格式详解

JSON 格式详解 随着互联网的发展和各种 Web 应用程序的普及&#xff0c;数据交换已经成为了我们日常开发中的重要环节。而在各种数据交换格式中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;作为一种轻量级的数据交换格式&#xff0c;以其简洁、易于阅…

2024.9.4(k8s)

一、前期准备 1、配置主机映射 [rootk8s-master ~]# vim /etc/hosts 192.168.8.168 k8s-master 192.168.8.176 k8s-node1 192.168.8.177 k8s-node2[rootk8s-master ~]# ping k8s-master 2、配置yum源 [rootk8s-master yum.repos.d]# vim kubernetes.repo [kubernetes] n…

智能医学(二)——MDPI特刊推荐

特刊征稿 01 特刊名称&#xff1a; eHealth and mHealth: Challenges and Prospects, 2nd Volume 参与期刊&#xff1a; 截止时间&#xff1a; 摘要提交截止日期 关闭(2024年6月30日) 投稿截止日期 2024年9月30日 目标及范围&#xff1a; 关键字 l 人工智能 l 计算机…

模拟实现string类及体验传统深拷贝

目录 strcpy 构造函数 优化 拷贝构造/深拷贝 operator size/operator[] operator<< c_str() 模拟string::iterator 插入 push_back() append() operator reserve npos strcpy strcpy是将/0拷贝完成后才会停止。 构造函数 string():_str(nullptr) {} st…