限制长度双向链表的插入操作

2023-05-16

    面试遇到的问题,一开始面试官是问我有什么方案可以实现排行榜,当时给出了两个方案。后面面试官又在我的其中一种方案上让我手写代码实现排序双线链表的插入,根据score值插入,并且链表长度限制在100。

    需要考虑的点:1)插入在链表表头的;2)插入到链表表尾;3)插入到链表中间;4)需要在遍历整个链表的时候统计链表的长度;5)如果长度刚好在100而插入刚好在末尾,则此时不需要执行插入操作。完整代码如下

#include <iostream>

using namespace std;

#define MAX_RANK 100

struct Link {
	int score;
	int uid;
	Link* prev;
	Link* next;
	Link() {
		score = 0;
		uid = 0;
		prev = NULL;
		next = NULL;
	}
};

Link* initLink(int n) {
	if (n <= 0) {
		return NULL;
	}
	int i = n;
	Link *head = new Link;
	head->score = i * 2;
	Link *node = head;
	while (i > 1) {
		i--;
		node->next = new Link;
		node->next->score = i * 2;
		node->next->prev = node;
		node = node->next;
	}
	return head;
}

void freeLink(Link *L) {
	Link *node = NULL;
	while (L) {
		node = L->next;
		delete L;
		L = node;
	}
}

Link* insertLinkLimit(Link* L, int score) {
	if (L == NULL) {
		L = new Link;
		L->score = score;
		return L;
	}
	int cnt = 1;
	Link *head = L, *tmp = L->next;
	if (L->score <= score) {
		// 插入链表头
		head = new Link;
		head->score = score;
		head->next = L;
		L->prev = head;
		cnt++;
	}
	else {
		while (tmp && L->score >= score && tmp->score >= score) {
			// 寻找非插入链表头时的插入位置
			L = tmp;
			tmp = tmp->next;
			cnt++;
		}
		if (tmp == NULL && cnt == MAX_RANK) {
			// 刚好是要直接插到第MAX_RANK+1即满链表的尾部,
			// 此时不插入,直接返回。
			return head;
		}
		// 其他情况执行插入操作
		// 1)在链表中间
		// 2)在链表末尾但是插入后长度没有超过限制
		L->next = new Link;
		L->next->score = score;
		L->next->next = tmp;
		L->next->prev = L;
		if (tmp) {
			tmp->prev = L->next;
		}
		L = L->next;
		cnt++;
	}
	// 因为需要统计长度,所以执行插入操作后还需要遍历链表
	while (tmp && cnt < MAX_RANK) {
		tmp = tmp->next;
		L = L->next;
		cnt++;
	}
	// 如果插入后操作长度限制,则需要删除最后一个节点。
	if (tmp) {
		delete tmp;
		L->next = NULL;
	}
	cout << cnt << endl;
	return head;
}

void printLink(Link* L) {
	while (L) {
		cout << L->score << " ";
		L = L->next;
	}
	cout << endl;
}

int main() {
	Link *L = initLink(10);
	L = insertLinkLimit(L, 111);
	printLink(L);
	freeLink(L);
	return 0;
}

      简单的测试了几种情况,输出都是对的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

限制长度双向链表的插入操作 的相关文章

随机推荐

  • [已解决] Mac上docker安装prometheus报错:Are you trying to mount a directory onto a file (or vice-versa)?

    文章目录 项目场景问题描述原因分析解决方案 项目场景 Mac上通过docker安装prometheus 问题描述 docker run时 xff0c 会出现下面的报错 xff0c 导致容器启动失败 xff1a docker Error re
  • Mac上安装Node Exporter

    文章目录 安装Node Exporter方法一 xff1a 手动安装方法二 xff1a docker安装 运行测试 node exporter 可以采集机器 xff08 物理机 虚拟机 云主机等 xff09 的监控指标数据 xff0c 能够
  • Docker安装Grafana

    文章目录 Grafana介绍拉取镜像准备相关挂载目录及文件启动容器访问测试添加 Prometheus 数据源常见问题 看板配置 Grafana介绍 上篇博客介绍了prometheus的安装 xff1a Docker部署Prometheus
  • Springboot应用接入Prometheus监控

    文章目录 接入介绍操作步骤修改应用的依赖及配置步骤1 xff1a 修改 pom 依赖步骤2 xff1a 修改配置 本地验证prometheus配置 接入介绍 在使用 Spring Boot 作为开发框架时 xff0c 需要监控应用的状态 x
  • Spring Boot自带监控组件—Actuator介绍

    文章目录 Actuator介绍启用与暴露的区别Spring Boot集成Actuator应用监控框架Actuator监控端点启用端点端点的默认暴露规则案例 自定义端点 Actuator介绍 Actuator是Spring Boot提供的应用
  • Git Commit提交规范总结

    文章目录 前言git commit 提交规范提交消息头 commit message header 提交消息具体内容 commit message body 提交消息尾述 commit message footer Revert 表情 Em
  • 常用kubectl命令总结

    文章目录 配置kubeconfig帮助信息命令查看具体某一个命令的帮助信息列出全局的选项参数 xff08 适用所有的命令 xff09 显示合并的 kubeconfig 配置或一个指定的 kubeconfig 文件 基本命令罗列所支持的完整资
  • 解决:org.apache.catalina.connector.ClientAbortException: java.io.IOException: 断开的管道

    文章目录 项目场景问题描述原因分析解决方案 项目场景 jdk11 Spring Boot 2 x 项目 xff0c Tomcat容器 Nginx 问题描述 系统日志中 xff0c 时不时会出现下面的异常信息 xff1a org apache
  • 解决:No converter for [xxxx] with preset Content-Type ‘text/plain;version=0.0.4;charset=utf-8‘

    文章目录 项目背景问题描述问题分析解决方案方案一 xff1a 修改Controller定义方案二 xff1a 修改Controller返回值方案三 xff1a 全局处理 项目背景 Spring Boot 2 X 问题描述 错误信息如下 xf
  • SYD8821 串口模块使用说明【串口0中断要屏蔽底层调用】

    SYD8821是具有全球领先低功耗 RX 2 4mA 64 94 5dBm灵敏度 xff0c TX 4 3mA 64 0dBm输出功率 的蓝牙低功耗SOC芯片 xff0c 在极低电流下实现了优异的射频性能 xff0c 搭配176kB SRA
  • MySQL的information_schema库下的常用sql

    文章目录 information schema TABLES查看该数据库实例下所有库大小 MB为单位 查看该实例下各个库大小 MB为单位 查看表大小 MB为单位 熟练使用 information schema库里的表 显示在库里的表 xff
  • shell脚本批量转文件格式:dos2unix

    文章目录 可以使用shell脚本实现 xff1a span class token shebang important bin sh span span class token assign left variable dir span s
  • 解决:com.atomikos.icatch.SysException: Error in init: Log already in use? tmlog in ./

    文章目录 项目场景问题描述原因分析详细分析 解决方案 项目场景 Spring Boot 2 x xff0c 集成 atomikos 问题描述 今天在同一个环境启动两个项目时报错 xff0c 因为两个项目同时涉及到分布式事物和切换数据源相关
  • Nginx日志介绍

    文章目录 access log日志流量统计 access log 日志文件一般存放在 var log nginx 下 xff0c 可以使用 tail f命令查看access日志 span class token function tail
  • JVM (Micrometer)-4701面板参数介绍

    文章目录 Quick Facts 概览 堆和非堆内存有以下几个概念 I O Overview xff08 服务黄金指标 xff09 JVM Memory xff08 JVM内存 xff09 JVM Misc xff08 JVM负载 xff0
  • curl文件传输命令

    CURL curl transfer a URL curl 是一个利用URL语法在命令行下工作的文件传输工具 支持文件上传和下载 格式 curl options URLs URL xff1a 通过大括号指定多个url 示例 xff1a cu
  • RS-485信号解析

    这次来看看RS 485信号 使用绿联的USB转RS485模块 线用的颜色不对 xff0c 类型也不对 xff0c 实际使用中请用带屏蔽层的双绞线 示波器CH1是R xff08 B xff09 示波器CH2是R 43 xff08 A xff0
  • T t与T t = T()的区别

    主要的区别就是默认构造函数对内置类型的初始化上 如果没有T中没有定义构造函数 xff0c 则对于 T t xff0c 并不会对 t 中内置类型设置初始值 xff0c 是一个随机值 但对于 T t 61 T xff0c 对 t 中内置类型会设
  • Effective STL:杂记(一)

    1 避免使用vector lt bool gt vector lt bool gt 实际上并不能算是一个STL容器 xff0c 实际上也并不存储bool 因为一个对象要成为STL容器 xff0c 就必须满足C 43 43 标准的第23 1节
  • 限制长度双向链表的插入操作

    面试遇到的问题 xff0c 一开始面试官是问我有什么方案可以实现排行榜 xff0c 当时给出了两个方案 后面面试官又在我的其中一种方案上让我手写代码实现排序双线链表的插入 xff0c 根据score值插入 xff0c 并且链表长度限制在10