笔记3. 链表

news/2024/11/18 19:54:26/文章来源:https://www.cnblogs.com/kongweisi/p/17299265.html

目录
  • 链表结构
    • 单链表和双链表
    • 链表题目常用技巧
  • 题目
    • 面试题 02.06. 回文链表
    • 给定一个数,把单链表划分为左边小于,中间相等,右边大的形式
    • 138. 复制带随机指针的链表
    • 单链表相交问题
  • 补充:哈希表和有序表的简单介绍

链表结构

单链表和双链表

// 单链表
typedef struct Node {int val;struct Node *next;
} Node;// 双链表
typedef struct Node {int val;struct Node *pre;struct Node *next;
} Node;

链表题目常用技巧

  1. 额外数据结构记录(哈希表等)
  2. 快慢指针

题目

面试题 02.06. 回文链表

  • 1->2->1具有回文结构,1->2->2->1具有回文结构,2->3->4不具有回文结构
    普通解法:栈
    高级解法:栈 + 快慢指针,只放链表后边一半的数据,这样可以节约一半的空间
    O(1)空间复杂度解法:快慢指针使得慢指针指向中点,然后把链表右边逆序,再从头部和尾巴分别反方向遍历,判断是否回文,最后把链表恢复原状

给定一个数,把单链表划分为左边小于,中间相等,右边大的形式

  • 面试题 02.04. 分割链表
  • 普通解法:参考荷兰国旗和快排,把链表变成数组去做
    高级解法:O(1)的时间复杂度,使用6个额外的链表节点指针,记录小于区,等于区和大于区
    image

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

  • 如果不考虑 random 指针的话,对一条链表进行拷贝,我们只需要使用两个指针:一个用于遍历原链表,一个用于构造新链表(始终指向新链表的尾部)即可。这一步操作可看做是「创建节点 + 构建 next 指针关系」。
    https://leetcode.cn/problems/fu-za-lian-biao-de-fu-zhi-lcof/solution/by-ac_oier-6atv/
// 伪代码,用于说明正常复制链表的操作
Node t = head;
Node dummy = new Node(-1), cur = dummy;
while (head != null) {Node node = new Node(head.val);cur.next = node;cur = cur.next; // 始终指向新链表的尾巴head = head.next;
}
/*** Definition for a Node.* struct Node {*     int val;*     struct Node *next;*     struct Node *random;* };*/typedef struct {void *key; // keyvoid *value;UT_hash_handle hh;
} HashTable;HashTable *g_hash;void HashAdd(void *cur, void *node)
{HashTable *tmp = NULL;HASH_FIND_PTR(g_hash, &cur, tmp); // 找if (tmp == NULL) {tmp = malloc(sizeof(HashTable));tmp->key = cur;tmp->value = node;HASH_ADD_PTR(g_hash, key, tmp);} else {printf("error\n");}
}struct Node* GetNode(void *cur)
{HashTable *tmp = NULL;HASH_FIND_PTR(g_hash, &cur, tmp);if (tmp != NULL) {return tmp->value;}return NULL;
}struct Node* copyRandomList(struct Node* head) 
{g_hash = NULL;struct Node *cur = head;struct Node *curPlus = NULL;// 第一次遍历加入hash表中while (cur != NULL) {curPlus = malloc(sizeof(HashTable));curPlus->val = cur->val;curPlus->next = NULL;curPlus->random = NULL;HashAdd((void *)cur, (void *)curPlus);cur = cur->next;}// 第二次遍历建立新链表cur = head;while (cur != NULL) {GetNode((void *)cur)->next = GetNode((void *)(cur->next));GetNode((void *)cur)->random = GetNode((void *)(cur->random));cur = cur->next;}return GetNode(head);
}

单链表相交问题

补充:哈希表和有序表的简单介绍

  • 哈希表在使用层面上可以理解为一种集合结构
  • 有序表在使用层面上可以理解为一种集合结构,哈希表能做的事情有序表都能做,但是基于有序的前提,有序表可以提供更丰富的API
  • 两者的区别是有序表把key按照顺序组织起来,而哈希表完全不组织
  • 红黑树、AVL树、b树和跳表等都属于有序表,只是底层具体实现方式不同
分类 c++名称 拷贝方式 描述 其他
哈希表 UnOrderedSet(UnSortedSet) 普通数据类型都是值拷贝,对象是引用拷贝 只有key,没有伴随数据value
哈希表 UnOrderedMa(UnSortedMap) 普通数据类型都是值拷贝,对象是引用拷贝 只有key,又伴随数据value
有序表 OrderedSet(SortedSet) 普通数据类型都是值拷贝,对象则必须提供比较器,否则不知道如何按照key排序,依然是引用拷贝 只有key,没有伴随数据value
有序表 OrderedMa(SortedMap) 普通数据类型都是值拷贝,对象则必须提供比较器,否则不知道如何按照key排序,依然是引用拷贝 只有key,又伴随数据value

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue2中安装scss

在终端执行命令cnpm i sass sass-loader -D 注意 ::v-deep

《程序员自我修养》读书笔记

目录虚拟地址空间(虚拟内存)布局编译与链接例子源码看看obj文件的组成格式主要的段全部的段组成格式:头信息+段一些概念和命令的总结概念命令 虚拟地址空间(虚拟内存)布局bss段节省的是文件的空间,不是虚拟地址空间指令段和数据段在程序运行起来后是不变的,不可伸缩从0地…

pip 下载速度慢

1、打开文件夹,输入%APPDATA%回车,打开%APPDATA%路径,并在此路径下新建一个pip文件夹:2、在pip文件夹下,新建pip.ini文件,并将以下内容添加至pip.ini文件中:[global] timeout = 6000 index-url = http://mirrors.aliyun.com/pypi/simple/ trusted-host = mirrors.aliyun…

ServiceHub.DataWarehouseHost.exe内存占用过高

最近在优化WCS系统中同层调度多辆车子的功能,功能写完后,顺手写了个仿真的脚本,模拟车辆动作。准备测试下合理性。但是使用VS2022进行调试时,刚调试时程序响应很快,因为总是被领导喊去参加各种会议,忙完回来,准备继续测试时,程序响应总是很慢,一开始没注意,以为是许久…

MongoDB基础知识梳理笔记

1、mongodb是什么? MongoDB 是由 C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在给 WEB 应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储给一个文档,数据结构由键值(key=&g…

restcontroller中使用delete请求发送带参路径报错

报错内容:Resolved [org.springframework.web.HttpRequestMethodNotSupportedException: Request method DELETE not supported] 具体情景:postman中发送的路径: 每次用这个路径发送delete请求都报错,但是用这个路径发送get请求做查询却没问题,真的让我苦恼好久解决:因为…

Axure介绍

Axure Axure是一款功能强大的原型设计工具,被广泛应用于用户体验设计领域。它的特点和使用方法使其受到了许多设计师和产品经理的青睐。 交互设计 Axure作为一款领先的原型设计工具,突出了其丰富的交互功能,为用户提供了广泛的设计自由度。无论是页面过渡、动画效果、还是表…

Qt/C++音视频开发74-合并标签图形/生成yolo运算结果图形/文字和图形合并成一个/水印滤镜

一、前言 在使用yolo做人工智能运算后,运算结果除了一个方框,还可能需要增加文字显示在对应方框上,以便标记是何种物体,比如显示是人还是动物,或者还有可能追踪人员,显示该人员的姓名。这种应用场景非常普遍,而且非常有必要,可以非常直观的直接看到对应移动的物体是什么…

一对一视频源码,实现限流对优化系统性能尤为重要

一对一视频源码,实现限流对优化系统性能尤为重要,主要内容为滑动日志,令牌桶,漏桶三种限流算法的Java实现获取连接许可的接口一、滑动日志用一个有序集合来存储所有请求的时间戳,以空间换时间的方式来简化计算二、令牌桶利用延迟计算来维护令牌数量三、漏桶漏桶算法原理类…

python-pdf2image

关于使用python将pdf转图片,网上大部分教程在讲pdf2image包 https://pypi.org/project/pdf2image/它需要用到一个poppler的程序,但是给的下载链接都过期了,去github下载最新项目发现路径下只有Library、share https://gh.jiasu.in/https://github.com/oschwartz10612/popple…

一对一视频聊天源码,水印功能实现方案不容错过

一对一视频聊天源码,水印功能实现方案不容错过一、基于原图生成水印图片(后端)这种方案就是将 原图片 添加水印之后生成了 新图片,后续在一对一视频聊天源码前端页面进行展示是后端接口不返回原图片,而是返回带有水印的图片即可。这种方式最大的优点就是安全,因为 水印图…

如何从多个文件夹内转移全部文件(忽略文件夹的结构)(进行复制)(再打包)

首先,需要用到的这个工具:度娘网盘 提取码:qwu2 蓝奏云 提取码:2r1z 04文件夹里面有只有1个名称为"1"的文件夹,“1”里面有“2”,“2”有“3”,“3”有“4”,从“1”开始,都有5个兔兔的图片,这是“1”里面的文件夹结构,现在要做的就是忽略文件夹结构,提…