数据结构链表题集

2023-11-09

在这里插入图片描述

题目一:113 · 删除排序链表中的重复数字(二) - LintCode

image-20220505124956609

思路:创建哨兵位头结点,原地删除

class Solution {
public:
    /**
     * @param head: head is the head of the linked list
     * @return: head of the linked list
     */

    //带哨兵位的删除方法
    ListNode* deleteDuplicates(ListNode *head) {
    //创建哨兵位
        ListNode* node=new ListNode(-1);
        node->next=head;
        //创建pre存放前指针
        ListNode* pre=node;
        //创建比较指针
        ListNode* cur=node->next;
        while(cur)
        {
            //创建标记值
            bool flag=false;
            while(cur->next&&cur->val==cur->next->val)
            {
                flag=true;
                cur=cur->next;
            }
            if(flag)
            {
                pre->next=cur->next;
                //考虑到cur->next==NULL的情况,所以
                //cur=cur->next而不是cur=cur->next->next
                cur=cur->next;
            }
            else
            {
                pre=cur;
                cur=cur->next;
            }
        }
        return node->next;
    }
};

题目二:36 · 翻转链表(二) - LintCode

image-20220505125155311

思路一:反转m到n的链表,然后在将链表全部串联

需要注意特殊情况:

  • 如果m==n就直接返回原来的链表
  • 如果m==1时,反转返回的head发生改变
class Solution {
public:
    ListNode* reverseBetween(ListNode *head, int m, int n) {
        if(m==n||head==NULL)
            return head;
        int cnt=1;
        ListNode* ls1=head,ls2=head;
        while(cnt<m-1)
        {
            ls1=ls1->next;
            ls2=ls2->next;
            cnt++;
        }
        while(cnt<n-1)
        {
            ls2=ls2->next;
            cnt++;
        }
        ListNode* next1,res;
        ListNode* next2=ls2->next->next;
        if(m==1)
        {
            next1=ls1;
            res=reverse(ls1,ls2->next);
            head=res;
            while(res!=next1)
            {
                res=res->next;
            }
            res->next=next2;
        }
        else
        {
            next1=ls1->next;
            res=reverse(ls1->next,ls2->next);
            ls1->next=res;
            while(res!=next1)
            {
                res=res->next;
            }   
            res->next=next2;
        }
        return head;
    }
    //反转链表
    ListNode* reverse(ListNode* ltnd1,ListNode* ltnd2)
    {
        ListNode* tmp=NULL;
        while(ltnd1!=ltnd2)
        {
            ListNode* newnode=ltnd1;
            ListNode* next=ltnd1->next;
            newnode->next=tmp;
            tmp=newnode;
            ltnd1=next;
        }
        ListNode* newnode=ltnd1;
        newnode->next=tmp;
        tmp=newnode;
        return tmp;
    }
};

思路二:创建数组,第一次遍历将m到n的数据全部存放在数组中;第二次遍历改变原结点的值 。

class Solution {
public:
    ListNode* reverseBetween(ListNode *head, int m, int n) {
        if(m==n||head==NULL)
            return head;
        vector<int> nums;
        int index=1,i=0;
        ListNode* cur=head;
        //第一次遍历
        while(cur)
        {   
            if(index>=m&&index<=n)
            {
                nums.push_back(cur->val);
            }
            index++;
            cur=cur->next;
        }
        //第二次遍历
        index=1;
        cur=head;
        while(cur)
        {
            if(index>=m&&index<=n)
            {
                cur->val=nums[nums.size()-1-i];
                i++;
            }   
            index++;
            cur=cur->next;
        }
        return head;
    }
};

题目三:96 · 链表划分 - LintCode

image-20220505163931443

思路:创建两个带哨兵位的链表;遍历一次链表,分别把小于x和大于等于x的结点存入两个链表中。最后将链表串接在一起

class Solution {
public:
    ListNode* partition(ListNode *head, int x) {
        //创建两个链表,一个存储大于x的数
        //另一个存储小于x的数
        //创建两个带哨兵位的链表
        ListNode* leftnum=new ListNode(0);
        ListNode* rightnum=new ListNode(0);
        ListNode* left=leftnum;
        ListNode* right=rightnum;
        while(head)
        {
            if(head->val<x)
            {
                left->next=head;
                left=head;
            }
            else
            {
                right->next=head;
                right=head;
            }
            head=head->next;
        }
        left->next=rightnum->next;
        right->next=NULL;
        return leftnum->next;
    }
};

题目四:LintCode 炼码

思路:在链表中实现快速排序

class Solution {
public:
	//在链表中实现快速排序
    ListNode* sortList(ListNode *head) {
	    if(head==NULL||head->next==NULL)
	    	return head;
		ListNode* fast=head;
		ListNode* slow=head;
		while(fast->next&&fast->next->next)
		{
			fast=fast->next;
			fast=fast->next;
			slow=slow->next;
		}
		ListNode* mid=slow->next;
		//拆解位两个链表
		slow->next=NULL;
		ListNode* ls1=sortList(head);
		ListNode* ls2=sortList(mid);
		//归并排序
		ListNode* res=merge(ls1,ls2);
		return res;
    }
    ListNode* merge(ListNode*list1,ListNode* list2)
    {
	    if(list1==NULL)	return list2;
	    if(list2==NULL) return list1;
	    //归并
	    ListNode* Head;
	    ListNode* cur;
	    if(list1->val<list2->val)
	    {
		    Head=list1;
		    list1=list1->next;
	    }else{
		    Head=list2;
		    list2=list2->next;
	    }
	    cur=Head;
	    while(list1&&list2)
	    {
		    if(list1->val<list2->val)
		    {
			    cur->next=list1;
			    cur=cur->next;
			    list1=list1->next;
		    }else
		    {
			    cur->next=list2;
			    cur=cur->next;
			    list2=list2->next;
		    }
	    }
	    if(list1)	cur->next=list1;
	    if(list2)	cur->next=list2;
	    return Head;
    }
};

题目五:LintCode 炼码

image-20220505173604159

class Solution {
public:
    //双指针,将结点的地址全部存储在一个数组中
    void reorderList(ListNode *head) {
        if(head==NULL)  return ;
        vector<ListNode*> nodes;
        ListNode* cur=head;
        while(cur)
        {
            nodes.push_back(cur);
            cur=cur->next;
        }
        int left=0;
        int right=nodes.size()-1;
        cur=head;
        while(left<right)
        {   
            nodes[left]->next=nodes[right];
            nodes[right--]->next=nodes[++left];
        }
        nodes[left]->next=NULL;
    }
};

题目六:LintCode 炼码

image-20220505175405013

思路:快慢指针

class Solution {
public:
    bool hasCycle(ListNode * head) {
	    if(head==NULL)	return false;
	    ListNode* fast=head;
	    ListNode* slow=head;
	    while(fast->next&&fast->next->next)
	    {
		    fast=fast->next;
		    fast=fast->next;
		    slow=slow->next;
		    if(fast==slow)
		    {
			    return true;
		    }
	    }
	    return false;
    }
};

题目7:170 · 旋转链表 - LintCode

image-20220505175849510

class Solution {
public:
    ListNode* rotateRight(ListNode *head, int k) {
	    if(head==NULL||k==0)	return head; 
	    int Len=Listlen(head);
	    int step=k%Len;
	    ListNode* cur=head;
	    vector<ListNode*> nodes;
	    while(cur)
	    {
		    nodes.push_back(cur);
		    cur=cur->next;
	    }
	    cur=head;
	    ListNode* tmp1=reverse(cur,nodes[nodes.size()-1-step]);
	    ListNode* tmp2=reverse(nodes[nodes.size()-step],nodes[nodes.size()-1])
	    (nodes[0])->next=tmp2;
	    ListNode* res=reverse(nodes[nodes.size()-1-step],nodes[nodes.size()-step]);
	    return res;
    }
    ListNode* reverse(ListNode* list1,ListNode* list2)
    {
	    ListNode* Head=NULL;
	    ListNode* tmp=
	    while(list1!=list2)
	    {
		    ListNode* newcode=list1;
		    newcode->next=Head;
		    Head=newcode;
		    list1=list1->next;
	    }
		ListNode* newcode=list1;
		newcode->next=Head;
		Head=newcode;
		return Head;
    }
    int Listlen(ListNode* head)
    {
	    int res=0;
	    while(head)
	    {
		    res++;
		    head=head->next;
	    }
	    return res;
    }
};

题目八:104 · 合并k个排序链表 - LintCode

image-20220506012448685

思路:使用优先队列

struct compare {
    bool operator()(const ListNode* l, const ListNode* r) {
        return l->val > r->val;
    }
};
class Solution {
public:

    ListNode *mergeKLists(vector<ListNode *> &lists) {
        if(lists.size()==0) return NULL;
        //创建优先队列
        priority_queue<ListNode* , vector<ListNode *>, compare> pq;
        for(auto i:lists)
        {
            if(i) pq.push(i);
        }
        ListNode * res = new ListNode(-1);
        ListNode * tail =res;
        while(!pq.empty())
        {
            ListNode* newnode=pq.top();
            pq.pop();
            tail->next=newnode;
            tail=newnode;
            if(newnode->next)
            {
                pq.push(newnode->next);
            }
        }
        return res->next;
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构链表题集 的相关文章

  • 平滑手绘曲线

    我有一个允许用户绘制曲线的程序 但这些曲线看起来不太好 它们看起来摇摇欲坠 而且是手绘的 所以我想要一种能够自动平滑它们的算法 我知道平滑过程中存在固有的模糊性 因此它不会每次都完美 但这种算法似乎确实存在于多个绘图包中 并且它们工作得很好
  • 警告 C4800:“int”:强制值为 bool“true”或“false”(性能警告)

    我的代码中有这个问题 bool CBase isNumber return id MID NUMBER bool CBase isVar return id MID VARIABLE bool CBase isSymbol return i
  • 局部函数声明有什么用处吗?

    大多数像我这样的 C 程序员都曾犯过以下错误 class C int main C c declares a function c taking no arguments returning a C not as intended by m
  • 将 dataGridView 中选定的行作为对象检索

    我有一堂这样的课 public partial class AdressBokPerson public long Session get set public string F rnamn get set public string Ef
  • 组合框下拉位置

    我有一个最大化的表单 其中包含 500px 的组合框控件 停靠在右上角 Width 尝试打开组合框后 列表的一半超出了屏幕 如何强制列表显示在表单中 棘手的问题 我找不到解决这个问题的好办法 只是一个解决方法 添加一个新类并粘贴如下所示的代
  • opencv中如何去除二值图像噪声?

    将图像转换为二值图像 黑白 后如果有任何噪音怎么办 我消除了那些不需要的噪音 您可以看到下图的黑色区域内有一些白噪声 我该如何去除噪声 使用opencv http img857 imageshack us img857 999 blackn
  • 对作为函数参数传递的指针使用删除

    删除作为函数参数传递的指针是否可以 并且合法 如下所示 include
  • 如何自定义 Google 测试失败消息?

    我编写了一个如下所示的 Google 测试 它将一些计算值与 CSV 文件中预期存储的值进行比较 class SampleTest public testing Test public void setupFile const std st
  • C# 枚举到字符串自动转换?

    是否可以让编译器自动将我的 Enum 值转换为字符串 这样我就可以避免每次都显式调用 ToString 方法 这是我想做的一个例子 enum Rank A B C Rank myRank Rank A string myString Ran
  • 我可以将 UseCSharpNullComparisonBehavior 用于单个查询吗?

    我有一个查询 该查询曾经是存储过程 现已转换为 EF 查询 现在已经超时了 使用 SQL Profiler 我可以看到生成的 SQL 的唯一区别是 EF 转变的新行为entity Property value into entity Pro
  • 配置:错误:无法运行C编译的程序

    我正在尝试使用 Debian Wheezy 操作系统在我的 Raspberry Pi 上安装不同的软件 当我运行尝试配置软件时 我尝试安装我得到此输出 checking for C compiler default output file
  • 当需要不同数量和类型的参数时如何创建操作委托列表

    我们有一组大约两打的类 它们继承自具有抽象 Validate 方法的基类 当然 每个类都有不同的验证需求 但它们之间的不同组合需要规则 因此 正如您可以想象的那样 这导致了大量代码重复 例如 A 类需要规则 1 3 6 和 9B 类需要规则
  • 如何同步nosql db(ravendb)中的更改

    我已经开始在 RavenDB 的示例上学习 NoSQL 我从一个最简单的模型开始 假设我们有由用户创建的主题 public class Topic public string Id get protected set public stri
  • 如何检测应用程序正在运行的 .NET 版本?

    我尝试使用Environment Version ToString 确定目标计算机上正在使用什么 NET 框架 但安装了 4 0 版本时 它说我正在使用 NET 2 0 如何检测目标计算机上正在运行的 NET Framework 版本 En
  • C 变量声明的效率 [重复]

    这个问题在这里已经有答案了 例如 在 C 中声明一个变量需要多长时间int x or unsigned long long var 我想知道它是否会让我的代码在类似的事情中更快 for conditions int var 0 code 这
  • “1个未解决的外部”C++

    我已经检查了所有文件之间的连接以及类和函数定义 但每次我尝试运行我的程序时 它都会阻止我并告诉我它有 1 个未解析的外部 该程序应该打开多个文件 一个 学生 文件和一个 成绩 文件 从中读取数据 然后使用 查询文件 来查找数据 找到查询中要
  • 卸载程序

    我正在尝试使用此代码卸载程序 但它似乎不起作用 我尝试过其他答案 但似乎也不起作用 有人可以帮助我吗 我正在尝试按给定名称 displayName 卸载该程序 例如 我给出 displayName Appname 那么此代码应该从我的计算机
  • 为什么在构造函数中设置字段是(或不是)线程安全的?

    假设您有一个像这样的简单类 class MyClass private readonly int a private int b public MyClass int a int b this a a this b b public int
  • 在windows + opengl中选择图形设备

    我知道如何使用 openGL 打开窗口 使用 Win32 或其他工具包 但是当系统有2块显卡时 如何选择要渲染的图形设备 我的编程语言是 C 我专注于 Windows 但任何示例都将受到欢迎 编辑 也许更好地解释我的问题是个好主意 以便添加
  • 如何使用 C# 为 azure devops 变量赋值

    我有 selenium C 测试脚本 可以从浏览器获取令牌 我有两个 azure devops 任务 一个用于执行 selenium 测试 另一个用于执行 API 测试 我想将 selenium 测试获取的令牌传递给 API 测试执行任务

随机推荐

  • mips-openwrt交叉编译 undefined reference to `__stack_chk_guard 错误

    最近在mips openwrt的工具链中交叉编译可执行程序时 出现了以下的错误 undefined reference to stack chk guard undefined reference to stack chk fail 百度一
  • CUDA编程 之 二进制工具与反编译

    两个 反编译工具 cuobjdump and nvdisasm 参考 http blog csdn net dark5669 article details 62264312
  • python中的copy和deepcopy

    数据处理经常会用到引用或者赋值 Python中的可变类型变量在操作时需要注意拷贝的方式 特别在实现复杂功能的函数时 一不小心就会改变原来的数据内容 data name anne age 18 scores 语文 130 数学 150 英语
  • CUDA和cuDNN各版本下载及版本对应关系

    CUDA和cnDNN是支持NVIDIA支持GPU的两个库 分别用于高性能计算和深度神经网络计算的支持 CUDA Compute Unified Device Architecture 是NVIDIA支持GPU的通用并行计算架构 该架构使GP
  • Python中常用的处理数据的方法——replace()方法

    replace 方法 描述 Python replace 方法用于把字符串中指定的旧子字符串替换成指定的新子字符串 如果指定 count 可选参数则替换指定的次数 默认全部替换 replace 方法语法 S replace old new
  • R包安装记录

    因为重复安装会引起某些问题以及冲突 已安装 library pheatmap 热图包 library corrplot 热图包 library Hmisc library dplyr
  • 一起学大数据|最详细的大数据学习资源教程,呕心沥血全部分享

    跟大家已经分享了这么长时间的大数据文章了 我们的一起来学大数据系列已经将Java和Linux全部做了一次基础的分享 今天 我把我整理的全套大数据资源分享给大家 一起共同学习 记得关注呦 很多初学者 对大数据的概念都是模糊不清的 大数据是什么
  • 常用设计模式-观察者模式

    观察者模式定义对象间的一种一对多的依赖关系 当一个对象的状态发生改变时 所有依赖于它的对象都得到通知并被自动更新 它还有两个别名 依赖 Dependents 发布 订阅 Publish Subsrcibe 当观察者观察到事件到来之后 通知对
  • hive —— 分区表

    hive 分区表 为了对表进行合理的管理以及提高查询效率 Hive可以将表组织成 分区 一个分区实际上就是表下的一个目录 一个表可以在多个维度上进行分区 分区之间的关系就是目录树的关系 通过PARTITIONED BY子句指定 分区的顺序决
  • zookeeper集群搭建

    一 安装zookeeper Zookeeper的下载地址http mirror bit edu cn apache zookeeper zookeeper 3 4 10 zookeeper集群需要java环境支持 所以要提前安装好JDK 在
  • 区分什么是Java内存模型(JMM)和 JVM运行时数据区

    文章目录 一 概念区分 1 什么是内存模型 什么是 内存区域 运行时数据区 2 为什么要有Java内存模型 2 1 硬件的效率与一致性 2 2 CPU和缓存的一致性 2 2 1 为什么需要CPU cache 2 2 2 三级缓存 L1 L2
  • css引入本地电脑、服务器字体

    font face font family DINProRegular src url fonts DINProRegular DINProRegular eot src url fonts fonts DINProRegular DINP
  • Vmware搭建软路由教程(Openwrt)

    Vmware搭建软路由 准备工作 vmware虚拟机 OpenWrt on VMware master包 https github com luoqeng OpenWrt on VMware提供下载 安装步骤 一 openwrt虚拟机安装
  • Vmware+UOS-server-1050e虚拟机安装(含软件链接)

    1 环境准备 以下使用的系统镜像是 uniontechos server 20 1050e amd64 iso 官网下载地址 统信UOS生态社区 打造操作系统创新生态 Vmware 使用的系统如果是win11 必须安装vmware16 官网
  • jQuery.获取修改value

    获取修改value val 方法 获取和修改有value属性的元素 有value属性的元素有input botton select等 相当于JavaScript中的value
  • FileInputStream的两种读入方式

    package Inputstream import org omg CORBA PUBLIC MEMBER import org testng annotations Test import java io FileInputStream
  • 使用libgmp时出现: 【C4146 一元负运算符应用于无符号类型,结果仍为无符号类型】的解决方案

    vs2019下 使用libgmp时出现 C4146 一元负运算符应用于无符号类型 结果仍为无符号类型 的错误 使用网上说的 关闭SDL检查 的方法无效 用下面的方法解决了这个问题 在 include
  • Pineapple Incident【Codeforces 697 A】

    Codeforces Round 362 Div 2 A 简单题 include
  • TPO39

    Some people hold the viewpoint that it was easier to distinguish a secure and successful job in the past instead of in t
  • 数据结构链表题集

    题目一 113 删除排序链表中的重复数字 二 LintCode 思路 创建哨兵位头结点 原地删除 class Solution public param head head is the head of the linked list re