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

昆山网站建设培训学校免费站长工具

昆山网站建设培训学校,免费站长工具,网站备案属于公司哪一块,设计个人网站的步骤链表解题技巧 额外的数据结构(哈希表);快慢指针;虚拟头节点; 复制含随机指针的链表 该链表节点的结构如下: class ListRandomNode { public:ListRandomNode() : val(0), next(nullptr), random(nullptr…

链表解题技巧

  • 额外的数据结构(哈希表);
  • 快慢指针;
  • 虚拟头节点;

复制含随机指针的链表

该链表节点的结构如下:

class ListRandomNode {
public:ListRandomNode() : val(0), next(nullptr), random(nullptr) {}ListRandomNode(int v, ListRandomNode *n, ListRandomNode *r) : val(v), next(n), random(r) {}
public:int val;ListRandomNode *next;ListRandomNode *random;
};

要求:时间复杂度O(N),空间复杂度O(1);

方法1:哈希表

时间复杂度O(N),空间复杂度O(N);

具体思路:

  • 遍历链表,复制每个节点并存入map,key为原节点,val为新节点;
  • 再次遍历链表,每个新节点都可以通过源节点和map找到,据此连接next和random;
    • 新节点的next就是,map[源节点]的next;
    • 新节点的random就是,map[源节点]的random;
ListRandomNode* LinkedList::copyListWithRandomByMap(ListRandomNode *head) {if (head == nullptr ) return head;std::unordered_map<ListRandomNode*, ListRandomNode*> ref;// create new nodeListRandomNode *cur = head;while (cur != nullptr) {ListRandomNode *tmp = new ListRandomNode(cur->val, nullptr, nullptr);ref[cur] = tmp;cur = cur->next;}// joint new nodecur = head;while (cur != nullptr) {ref[cur]->next = ref[cur->next];ref[cur]->random = ref[cur->random];cur = cur->next;}return ref[head];
}

方法2:next

时间复杂度O(N),空间复杂度O(1);

将每一个新节点放在原来节点的后面,并连接上下一个节点的方式,这样通过next就能够定位到新节点,通过next的next就能找到原来的下一个节点。

  • 遍历一遍链表,遍历的过程中,为每一个节点创建一个新节点,新节点连接在原来两个节点之间;
  • 再次遍历链表,为random赋值:新节点的random就是,源节点random的next;
  • 再将源节点和新节点分离出来,返回新节点头即可。
ListRandomNode* LinkedList::copyListWithRandom(ListRandomNode *head) {if (head == nullptr) return head;// create new nodeListRandomNode *cur = head;while (cur != nullptr) {ListRandomNode *cur_ = new ListRandomNode(cur->val, nullptr, nullptr);ListRandomNode *tmp = cur->next;cur->next = cur_;cur_->next = tmp;cur = tmp;}// assign random pointerscur = head;while (cur != nullptr) {cur->next->random = cur->random ? cur->random->next : nullptr;cur = cur->next->next;}// splitcur = head;ListRandomNode *new_head = head->next;ListRandomNode *cur_ = head->next;while (cur_->next != nullptr) {cur->next = cur_->next;cur = cur->next;cur_->next = cur->next;cur_ = cur_->next;}cur->next = nullptr;cur_->next = nullptr;return new_head;
}

辅助函数

根据数组生成带随机值的链表:

ListRandomNode* LinkedList::generateListWithRandom(int *arr, int len) {if (arr == nullptr || len < 1) {return nullptr;}std::vector<ListRandomNode*> vec;ListRandomNode *head = new ListRandomNode(arr[0], nullptr, nullptr);ListRandomNode *cur = head;for (int i = 1; i < len; i++) {vec.push_back(cur);cur->next = new ListRandomNode(arr[i], nullptr, nullptr);cur = cur->next;}vec.push_back(cur);for (int i = 0; i < len; i++) {vec[i]->random = vec[rand() % len];}return head;
}

打印随机链表:

void LinkedList::printListWithRandom(ListRandomNode *head) {while (head) {std::cout << head->val << "[" << head->random->val << "]" << (head->next ? "->" : " ") ;head = head->next;}std::cout << std::endl;
}
http://www.shuangfujiaoyu.com/news/43099.html

相关文章:

  • 海口双语网站建设上海哪家seo好
  • 青岛有没有做网站的小江seo
  • 贵阳网站建设设计成人技术培训学校
  • 上海建筑工程招投标网网站推广及seo方案
  • 做视频网站用什么语言seo课培训
  • 音乐网站设计规划书网络营销seo培训
  • 网站做批发文具微博推广怎么做
  • 淘宝网站建设类目需要什么资质搜索引擎优化关键字
  • 网站建设的预算seo是什么
  • 如何找外贸网站建设公司百度识图入口
  • 电影网站html模板google搜索引擎入口
  • 用eclipse做网站 seo won
  • 传播型网站建设优势有哪些职业培训机构资质
  • 搜索引擎营销网站南宁百度seo软件
  • 网站登陆验证怎么用java做seo引擎优化是什么
  • 网站没有ftp 怎么推广免费建一个自己的网站
  • 梧州政府网站网址注册查询
  • 个人网站需要哪些内容百度首页登录官网
  • 怎么才能注册网站安卓神级系统优化工具
  • 专业设计素材网站竞价托管信息
  • 建设安全备案网站baidu com百度一下
  • 网站名称 注册seo职业发展
  • 企业平台网站建设武汉百度推广入口
  • 网站上传软件教育培训机构推荐
  • 做HH网站自己想做个网站怎么做
  • 网站设计批发山西疫情最新情况
  • wordpress搭建视频站哪有恶意点击软件买的
  • 寮步网站制作怎么做网站链接
  • 2b的网站运营怎么做好网站
  • 做的网站提示不安全问题优化排名推广技术网站