【数据结构】两两交换链表 && 复制带随机指针的链表

问题描述1

给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。

求解

使用一个栈S来存储相邻两个节点即可

cpp 复制代码
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution {
public:
    ListNode* swapPairs(ListNode* head) {
        stack<ListNode*> s;
        if(head==nullptr || head->next == nullptr){
            return head;
        }
        ListNode * p = new ListNode();
        ListNode * cur = head;
        head = p;
        while(cur!=nullptr && cur->next !=nullptr){
            s.push(cur);
            s.push(cur->next);
            cur = cur->next->next;
            p->next = s.top();
            s.pop();
            p = p->next;
            p->next = s.top();
            s.pop();
            p = p->next;
        }
        if(cur==nullptr){
            p->next = nullptr;
        }
        else if(cur->next == nullptr){
            p->next = cur;
        }

        return head->next;


    }
};

问题描述2

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。

例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。

返回复制链表的头节点。

用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

val:一个表示 Node.val 的整数。

random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。

你的代码 只 接受原链表的头节点 head 作为传入参数。

求解

使用哈希表。

利用哈希表的查询特点,考虑构建 原链表节点 和 新链表对应节点 的键值对映射关系,再遍历构建新链表各节点的 next 和 random 引用指向即可。

cpp 复制代码
/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/

class Solution {
public:
    Node* copyRandomList(Node* head) {
        if(head==NULL){
            return NULL;
        }
        unordered_map<Node*, Node*> mp;
        Node * cur = head;
        while(cur!=NULL){
            mp[cur] = new Node(cur->val);
            cur = cur->next;
        }
        cur =  head;
        while(cur !=NULL){
            mp[cur]->next = mp[cur->next];
            mp[cur]->random = mp[cur->random];
            cur = cur->next;
        }
        return mp[head];

        
    }
};
相关推荐
浅念-12 分钟前
C语言——单链表
c语言·开发语言·数据结构·经验分享·笔记·算法·leetcode
夏乌_Wx13 分钟前
练题100天——DAY40:合并两个有序链表
数据结构
hans汉斯18 分钟前
建模与仿真|基于GWO-BP的晶圆机器人大臂疲劳寿命研究
大数据·数据结构·算法·yolo·机器人·云计算·汉斯出版社
IT陈图图1 小时前
Flutter × OpenHarmony 文件管家:数据结构设计与实现
数据结构·flutter
budingxiaomoli1 小时前
优选算法-哈希表
数据结构·算法·散列表
平哥努力学习ing1 小时前
线性表与链表(part 1)
数据结构·链表
老鼠只爱大米2 小时前
LeetCode经典算法面试题 #142:环形链表 II(哈希表、快慢指针等多种方法详细解析)
算法·leetcode·链表·快慢指针·floyd算法·环形链表
小龙报2 小时前
【C语言进阶数据结构与算法】LeetCode27 && LeetCode88顺序表练习:1.移除元素 2.合并两个有序数组
c语言·开发语言·数据结构·c++·算法·链表·visual studio
Script kid2 小时前
Redis(Remote Dictionary Server远程字典服务器)五种常见数据结构及常见用法和指令
服务器·数据结构·redis
范纹杉想快点毕业2 小时前
C语言查找算法对比分析
数据结构·算法