数据结构-链表OJ

news2024/12/23 3:17:17

1.删除链表中等于给定值 val 的所有结点。

. - 力扣(LeetCode)

思路一:遍历原链表,将值为val的节点释放掉

思路二:创建一个新链表,将值不为val的节点尾插到新链表中

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {
    //创建一个新链表
    ListNode*newhead,*newtail;
    newhead=newtail=NULL;
    ListNode*pcur=head;//用来遍历链表
    while(pcur)
    {
        if(pcur->val!=val)
        {
            if(newhead==NULL)//链表为空
            {
                newhead=newtail=pcur;
            }
            else //尾插
            {
                newtail->next=pcur;
                newtail=newtail->next;
            }
        }
        pcur=pcur->next;
    }
    if(newtail)
    {
        newtail->next=NULL;
    }
    return newhead;

}

2.反转一个单链表。

. - 力扣(LeetCode)

 思路1:创建一个新链表,将新节点拿下来头插

思路2:创建三个指针完成链表的翻转

 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) {
    if(head==NULL)
    {
        return NULL;
    }
    ListNode*n1,*n2,*n3;
    n1=NULL;
    n2=head;
     n3=head->next;
     while(n2)
    {
        n2->next=n1;
        n1=n2;
        n2=n3;
        if(n3)
        {
            n3=n3->next;
        }
    }
    return n1;  
}

3.寻找链表的中间节点。

. - 力扣(LeetCode)

 思路:使用快慢指针,快指针走2步,慢指针走1步,快指针走到空或者next指针为空时,慢指针指向的就是中间节点

 

 

 

 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {
    //快慢指针
    ListNode*slow,*fast;
    slow=head;
    fast=head;
    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
    }
    return slow;
}

4.输入一个链表,输出该链表中倒数第k个结点。

. - 力扣(LeetCode)

 要求空间复杂度为O(1),只能遍历一遍链表

思路:快慢指针,快指针先走k步,然后快慢指针同时走,当快指针走到空时,slow指针指向的就是倒数第k个节点

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */

typedef struct ListNode ListNode;
int kthToLast(struct ListNode* head, int k){
    ListNode*fast=head;
    ListNode*slow=head;
    while(k--)
    {
        fast=fast->next;
    }
    while(fast)
    {
        fast=fast->next;
        slow=slow->next;
    }
    return slow->val;
}

5.将两个有序链表合并为一个新的有序链表并返回。

. - 力扣(LeetCode)

    

思路:创建一个新的链表,遍历原链表,将链表中较小的节点尾插到新链表中

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {
    if(list1==NULL)
    {
        return list2;
    }
    if(list2==NULL)
    {
        return list1;
    }
    ListNode*newhead,*newtail;
    newhead=newtail=NULL;
    ListNode*l1=list1;
    ListNode*l2=list2;
    while(l1&&l2)
    {
        if(l1->val<l2->val)
        {
            //将l1拿下来尾插
            if(newhead==NULL)
            {
                newhead=newtail=l1;
            }
            else
            {
                newtail->next=l1;
                newtail=newtail->next;
            }
            l1=l1->next;
        }
        else
        {
            //将l2拿下尾插
            if(newhead==NULL)
            {
                newhead=newtail=l2;
            }
            else
            {
                newtail->next=l2;
                newtail=newtail->next;
            }
            l2=l2->next;
        }
    }
    //跳出循环,要不就是l1走到空,就是l2走到空
    if(l1)//if(l1!=NULL)
    {
        newtail->next=l1;
    }
    if(l2)//if(l2!=NULL)
    {
        newtail->next=l2;
    }
    return newhead;
}

6. 分割链表

链表分割_牛客题霸_牛客网

 

思路一:在原链表上进行修改,定义pcur从起始位置开始走,若pcur节点小于x,往后走:若pcur节点值大于等于x,尾插在链表之后。

思路二:创建一个新链表,若pcur节点的值小于x,头插在新链表中:若pcur节点的值大于等于x,尾插在新链表中。

思路三:创建两个链表,大链表和小链表。

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        if(pHead==NULL)
        {
            return pHead;
        }
        //创建两个带头链表
        struct ListNode*lesshead,*lesstail;
        struct ListNode*greaterhead,*greatertail;
        lesshead=lesstail=(struct ListNode*)malloc(sizeof(struct ListNode));
        greaterhead=greatertail=(struct ListNode*)malloc(sizeof(struct ListNode));
        //遍历原链表
        struct ListNode*pcur=pHead;
        while(pcur)
        {
            if(pcur->val<x)
            {
                //尾插到小链表中
                lesstail->next=pcur;
                lesstail=lesstail->next;
            }
            else 
            {
                //尾插到大链表中
                greatertail->next=pcur;
                greatertail=greatertail->next;
            }
            pcur=pcur->next;
        }
        greatertail->next=NULL;
        lesstail->next=greaterhead->next;
        return lesshead->next;
    }
};

7.判断链表是否为回文结构

链表的回文结构_牛客题霸_牛客网

 

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:
    //寻找链表的中间节点
    struct ListNode *middleNode(struct ListNode*head)
    {
        struct ListNode*slow=head;
        struct ListNode*fast=head;
        while(fast&&fast->next)
        {
            slow=slow->next;
            fast=fast->next;
        }
        return slow;
    }
    //将中间节点和之后的节点逆置
    struct ListNode* reverseList(struct ListNode* head) {
    struct ListNode*cur=head;
    struct ListNode*newhead=NULL;
    while(cur)
    {
        struct ListNode*next=cur->next;
        //头插
        cur->next=newhead;
        newhead=cur;
        cur=next;
    }
    return newhead;
    }

    bool chkPalindrome(ListNode*A)
    {
       struct ListNode*mid=middleNode(A);
       struct ListNode*rmid=reverseList(mid);
       while(A&&rmid)
       {
            if(A->val!=rmid->val)
            {
                return false;
            }
            A=A->next;
            rmid=rmid->next;
       }
       return true;
    }
};

8.寻找两个链表的公共节点

. - 力扣(LeetCode)

 

 

 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
 typedef struct ListNode ListNode;
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    ListNode*curA=headA;
    ListNode*curB=headB;
    int lenA=1;
    int lenB=1;
    while(curA->next)
    {
        curA=curA->next;
        lenA++;
    }
    while(curB->next)
    {
        curB=curB->next;
        lenB++;
    }
    //尾节点不相等就不相交
    if(curA!=curB)
    {
        return NULL;
    }
    //长的先走差距步,再同时走,第一个相等就是交点
    //假设法
    int gap=abs(lenA-lenB);
    ListNode*longlist=headA;
    ListNode*shortlist=headB;
    if(lenB>lenA)
    {
        longlist=headB;
        shortlist=headA;
    }
    while(gap--)
    {
        longlist=longlist->next;
    }
    while(longlist!=shortlist)
    {
        longlist=longlist->next;
        shortlist=shortlist->next;
    }
    return longlist;

}

9.随机链表的复制

. - 力扣(LeetCode)

 给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任一节点

 

/**
 * Definition for a Node.
 * struct Node {
 *     int val;
 *     struct Node *next;
 *     struct Node *random;
 * };
 */
typedef struct Node Node;
struct Node* copyRandomList(struct Node* head) {
    Node*cur=head;
    //将拷贝节点插入在原节点的后面
    while(cur)
    {
        Node*copy=(Node*)malloc(sizeof(Node));
        copy->val=cur->val;
        copy->next=cur->next;
        cur->next=copy;
        cur=copy->next;
    }
    //控制random
    cur=head;
    while(cur)
    {
        Node*copy=cur->next;
        if(cur->random==NULL)
        {
            copy->random=NULL;
        }
        else
        {
            copy->random=cur->random->next;
        }
        cur=copy->next;
    }
    //把拷贝节点取下来尾插成为新链表
    Node*copyhead=NULL;
    Node*copytail=NULL;
    cur=head;
    while(cur)
    {
        Node*copy=cur->next;
        Node*next=copy->next;
        if(copyhead==NULL)
        {
            copyhead=copytail=copy;
        }
        else
        {
            copytail->next=copy;
            copytail=copytail->next;
        }
        cur=next;
    }
	return copyhead;
}

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

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

相关文章

Stable Diffusion WebUI 中调度器(Schedule type)简单研究

&#x1f48e;内容概要 在近期&#xff0c;stable diffusion webui更新了1.9版本&#xff0c;其中包含的一项变化就是&#xff0c;把采样器和调度器&#xff08;Schedule type&#xff09;分开了&#xff0c;之前是合并在一起来选择的&#xff0c;所以这篇文章主要分两个部分&…

用Langchain创建一个可以总结网页内容的Agent

去年的时候我写过一篇关于OpenAi Function Call的实践文章&#xff0c;就是用Function Call的功能实现抓取并总结网页内容的功能&#xff0c;具体可以参考ChatGPT函数调用初体验&#xff1a;让ChatGPT具备抓取网页文本的能力&#xff0c;当时写了还算比较多的代码&#xff0c;最…

查询每个部门工资最高的员工 sql

在线运行sql语句 CREATE TABLE dept (dno INT PRIMARY KEY AUTO_INCREMENT,dname VARCHAR(50) NOT NULL,dlocal VARCHAR(100) ); CREATE TABLE employee (eno INT PRIMARY KEY AUTO_INCREMENT,ename VARCHAR(50) NOT NULL,egender CHAR(2),deptno INT NOT NULL,ejob VARCHAR(5…

动态规划-两个数组的dp问题1

文章目录 1. 最长公共子序列&#xff08;1143&#xff09;2. 不相交的线&#xff08;1035&#xff09; 1. 最长公共子序列&#xff08;1143&#xff09; 题目描述&#xff1a; 状态表示&#xff1a; 建立一个二维的数组dp&#xff0c;dp[i][j]表示在第一个字符串的0到i区间以…

如何定时打开网站

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 1、打开工具按下Ctrl3&#xff0c;切换到定时器模块&#xff0c;左侧右键&#xff0c;选择新建 2、标题叫百度&#xff0c;等下就让它打开百度&#xff0c…

在Windows系统cmd中输入python无法启动想要的版本 | cmd输入python反而启动Microsoft Store

在Windows系统cmd中输入python无法启动想要的版本 | cmd输入python反而启动Microsoft Store 情况一&#xff1a;无法启动目标python版本&#xff0c;明明已经添加了环境变量 根源&#xff1a;环境变量Path中有多个版本的python路径&#xff0c;想启动的python对应的环境变量排…

STM32F407实现傅里叶变换的三种方法【附源码】

一、浅谈傅里叶变换&#xff08;Fourier Transformation&#xff0c;FT&#xff09; 1、傅里叶级数 想要了解傅里叶变换&#xff0c;就要先了解一下什么是傅里叶级数。 如图所示&#xff0c;通过不断合成不同频率的正弦波&#xff08;频率分量&#xff09;&#xff0c;合成后…

【电子通识】“二八定律”(巴莱多定律)在电子维修中也是这样吗?

二八定律的大意是说&#xff1a;少数20%的东西&#xff0c;占据了80%的另外一种东西。 比如世界大约20%的人占据了大约80%的财富&#xff1b;地球上20%的国家占据了80%的石油资源&#xff1b;太阳系中80%的质量集中在20%的天体上面&#xff1b;20%的疾病是80%病死者的直接死亡原…

什么是弹性云服务器(ECS)

弹性云服务器&#xff08;Elastic Cloud Server&#xff0c;ECS&#xff09;是由CPU、内存、操作系统、云硬盘组成的基础的计算组件。弹性云服务器创建成功后&#xff0c;您就可以像使用自己的本地PC或物理服务器一样&#xff0c;在云上使用弹性云服务器。 云服务器ECS&#x…

微软如何打造数字零售力航母系列科普07 - Azure PlayFab:你从未想过的世界上最大的开发工具(平台)

Azure PlayFab&#xff1a;你从未想过的世界上最大的开发工具 微软的James Gwertzman告诉GamesIndustry.biz Academy他帮助开发者成功的使命 制作游戏比以往任何时候都更容易上手。现在有无数的游戏引擎可供选择&#xff0c;其中大多数是免费的&#xff0c;PC空间的店面也同样重…

【CAN】知识点:错误帧、远程帧、过载帧

0、帧用途 数据帧:用于发送单元向接收单元传送数据的帧; 远程帧:用于接收单元向具有相同标识符的发送单元请求数据的帧; 错误帧:用于当检测出错误时向其它单元通知错误的帧; 过载帧:用于接收单元通知其尚未做好接收准备的帧 1、远程帧 1.1 帧结构 数据帧和远程帧有标…

C++深度解析教程笔记7

C深度解析教程笔记7 第13课 - 进阶面向对象&#xff08;上&#xff09;类和对象小结 第14课 - 进阶面向对象&#xff08;下&#xff09;类之间的基本关系继承组合 类的表示法实验-类的继承 第15课 - 类与封装的概念实验-定义访问级别cmd 实验小结 第16课 - 类的真正形态实验-st…

链表经典面试题上

目录 创作不易&#xff0c;如若对您有帮助&#xff0c;还望三连&#xff0c;谢谢&#xff01;&#xff01;&#xff01; 题目一&#xff1a;203. 移除链表元素 - 力扣&#xff08;LeetCode&#xff09; 题目二&#xff1a;206. 反转链表 - 力扣&#xff08;LeetCode&#xff…

攻防世界XCTF-WEB入门12题解题报告

WEB入门题比较适合信息安全专业大一学生&#xff0c;难度低上手快&#xff0c;套路基本都一样 需要掌握&#xff1a; 基本的PHP、Python、JS语法基本的代理BurpSuite使用基本的HTTP请求交互过程基本的安全知识&#xff08;Owasp top10&#xff09; 先人一步&#xff0c;掌握W…

EasyExcel 处理 Excel

序言 本文介绍在日常的开发中&#xff0c;如何使用 EasyExcel 高效处理 Excel。 一、EasyExcel 是什么 EasyExcel 是阿里巴巴开源的一个 Java Excel 操作类库&#xff0c;它基于 Apache POI 封装了简单易用的 API&#xff0c;使得我们能够方便地读取、写入 Excel 文件。Easy…

力扣数据库题库学习(4.28日)--1581.进店却未进行过交易的顾客

1581. 进店却未进行过交易的顾客 问题链接 思路分析 有一些顾客可能光顾了购物中心但没有进行交易。请你编写一个解决方案&#xff0c;来查找这些顾客的 ID &#xff0c;以及他们只光顾不交易的次数。返回以 任何顺序 排序的结果表。 要求&#xff1a; 获取只浏览不消费的…

MySQL-笔记-08.数据库编程

目录 8.1 编程基础 8.1.1 基本语法 8.1.2 运算符与表达式 1. 标识符 2. 常量 &#xff08;1&#xff09; 字符串常量 &#xff08;2&#xff09;日期时间常量 &#xff08;3&#xff09;数值常量 &#xff08;4&#xff09;布尔值常量 &#xff08;5&#xff09;NULL…

深度学习:基于Keras,使用长短期记忆人工神经网络模型(LSTM)对股票市场进行预测分析

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

百度网盘上的资料怎么打印出来?

百度网盘是一种云端存储服务&#xff0c;许多人选择将工作和学习相关的资料存储在百度网盘中&#xff0c;以便在需要时方便使用。要将百度网盘上的资料打印出来&#xff0c;实际上有多种方法。例如&#xff0c;您可以将百度网盘中的资料下载到本地&#xff0c;然后前往打印店进…

结合创新!频域+时间序列,预测误差降低64.7%

频域时间序列不仅能提供更丰富的信息&#xff0c;还能提高模型性能和预测准确性。对于论文er来说&#xff0c;是个可发挥空间大、可挖掘创新点多的研究方向。 具体来说&#xff1a; 通过将复杂的时间序列数据转换成简单的频率成分&#xff0c;我们可以更容易地捕捉到数据的周期…