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

问题描述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];

        
    }
};
相关推荐
小许学java3 小时前
数据结构-ArrayList与顺序表
java·数据结构·顺序表·arraylist·线性表
程序员莫小特6 小时前
老题新解|大整数加法
数据结构·c++·算法
小刘max7 小时前
深入理解队列(Queue):从原理到实践的完整指南
数据结构
蒙奇D索大8 小时前
【数据结构】考研数据结构核心考点:二叉排序树(BST)全方位详解与代码实现
数据结构·笔记·学习·考研·算法·改行学it
洲覆8 小时前
C++ 模板、泛型与 auto 关键字
开发语言·数据结构·c++
MoRanzhi12038 小时前
15. Pandas 综合实战案例(零售数据分析)
数据结构·python·数据挖掘·数据分析·pandas·matplotlib·零售
WIN赢10 小时前
【二叉树的递归算法与层序遍历算法】
数据结构
Zzzzmo_10 小时前
【Java】杨辉三角、洗牌算法
java·数据结构·算法
岑梓铭12 小时前
《考研408数据结构》第四章(串和串的算法)复习笔记
数据结构·笔记·考研·算法
胖咕噜的稞达鸭13 小时前
缝合怪deque如何综合list和vector实现及仿函数模板如何优化priority_queue实现
数据结构·c++·算法·链表·list