当前位置: 首页 > news >正文

OJ2219左移右移(链表)——蓝桥杯2022年国赛

代码为(双向链表):

#include <bits/stdc++.h>
using namespace std;
struct link {int data;link* prev;link* next;
};
int main()
{int n, m; cin >> n >> m;
link* l = new link();  // 创建头节点,不存储实际数据,仅作为起始点
link* tail = l;        // 尾指针初始指向头节点
unordered_map<int, link*> h;  // 哈希表,用于快速查找任何节点
for (int i = 1; i <= n; i++) {link* p = new link();p->data = i;p->next = nullptr;p->prev = tail;tail->next = p;tail = p;h[i] = p;  // 存储指针到哈希表,以便通过数据值快速定位节点
}
for (int i = 0; i < m; i++) {char c; int a; cin >> c >> a;link* tar = h[a];  // 从哈希表中直接获取目标节点if (c == 'L') {  // 左移操作if (tar->prev->data != 0) {  // 如果已经是第一个实际节点,则不操作if (tar->next != nullptr) {  // 如果不是最后一个节点tar->next->prev = tar->prev;} else {tail = tar->prev;  // 更新尾指针}tar->prev->next = tar->next;  // 从当前位置移除节点// 将节点移至头部tar->next = l->next;l->next->prev = tar;tar->prev = l;l->next = tar;}} else {  // 右移操作if (tar->next != nullptr) {  // 如果不是最后一个节点tar->prev->next = tar->next;tar->next->prev = tar->prev;  // 从当前位置移除节点// 将节点移至尾部tar->next = nullptr;tar->prev = tail;tail->next = tar;tail = tar;  // 更新尾指针}}
}
l = l->next;while (l) {cout << l->data << " ";l = l->next;}return 0;
}

注:

  unordered_map 来实现快速查找节点。

分析:

link* l = new link();  
link* tail = l;       
unordered_map<int, link*> h; 
for (int i = 1; i <= n; i++) {link* p = new link();p->data = i;p->next = nullptr;p->prev = tail;tail->next = p;tail = p;h[i] = p;  
}

这一段代码初始化了链表,从头节点开始,逐个添加节点到链表尾部。同时,在哈希表中保存每个值与对应节点的映射,这样可以在 O(1) 时间复杂度内通过节点值找到对应的链表节点。

for (int i = 0; i < m; i++) {char c; int a; cin >> c >> a;link* tar = h[a];  if (c == 'L') { if (tar->prev->data != 0) {  if (tar->next != nullptr) {  tar->next->prev = tar->prev;} else {tail = tar->prev;  }tar->prev->next = tar->next;  tar->next = l->next;l->next->prev = tar;tar->prev = l;l->next = tar;}} else {  // 右移操作if (tar->next != nullptr) {  tar->prev->next = tar->next;tar->next->prev = tar->prev;  // 将节点移至尾部tar->next = nullptr;tar->prev = tail;tail->next = tar;tail = tar;  }}
}

这段代码处理每个移动操作:

  • 左移:将节点移至链表的首部(即头节点的直接后继),确保不是已经在最前面。
  • 右移:将节点移至链表的尾部,确保不是已经在最后面。
l = l->next;
while (l) {cout << l->data << " ";l = l->next;
}

最后,从头节点的下一个节点开始,遍历链表并输出每个节点的数据,直到链表结束。


http://www.mrgr.cn/news/23156.html

相关文章:

  • 期货量化-群体优化算法:混合蛙跳算法(SFL)
  • 计算机毕业设计Pyhive+Spark招聘可视化 职位薪资预测 招聘推荐系统 招聘大数据 招聘爬虫 大数据毕业设计 Hadoop Scrapy
  • 哈希表的学习
  • TON的两种地址
  • CSS选择器
  • 【C++ 面试 - 新特性】每日 3 题(七)
  • 拉新充场行业内幕,3种赚钱方式和3个风险点,选副业谨慎入行!
  • 【通信管理之c++基础01】std::future
  • Unity Addressables 使用说明(三)构建内容(Build Content)
  • [基金理财] 投资组合的搭建
  • 干货分享|分享一款微软出品的工作效率神器 PowerToys
  • 【C++ 面试 - 新特性】每日 3 题(六)
  • 【C语言】字符串函数详细讲解
  • golang
  • 连锁企业管理系统管哪些 80%的连锁企业一开始选错了
  • Servlet(二)
  • 并发编程(六)
  • Git 拉取代码,图形化工具即开即用
  • Unet改进30:添加CAA(2024最新改进方法)|上下文锚定注意模块来捕获远程上下文信息。
  • 皮肤表皮层