当前位置:网站首页>剑指Offer||:链表(简单)

剑指Offer||:链表(简单)

2022-06-28 07:23:00 _索伦

系列文章目录

  1. 【栈与队列】


剑指 Offer 06. 从尾到头打印链表

原题链接:从尾到头打印链表

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

题解:
利用虚拟头节点接受逆置后的链表,然后遍历链表,尾插到返回数组中。

class Solution {
    
public:
    vector<int> reversePrint(ListNode* head) {
    
        ListNode* dummy = new ListNode();
        dummy = ReverseList(head);

        vector<int> ans;
        while (dummy != nullptr) {
    
            ans.emplace_back(dummy->val);
            dummy = dummy->next;
        }

        return ans;
    }
	
	// 链表的逆置
    ListNode* ReverseList(ListNode* head) {
    
        ListNode* prev = nullptr;
        ListNode* curr = head;
        while (curr != nullptr) {
    
            ListNode* next = curr->next;
            curr->next = prev;
            prev = curr;
            curr = next;
        }
        return prev;
    }
};

剑指 Offer 35. 复杂链表的复制

原题链接:复杂链表的复制

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

在这里插入图片描述

题解:

我们首先将该链表中每一个节点拆分为两个相连的节点,例如对于链表 A→B→C,我们可以将其拆分为 A→A′→B→B′→C→C’。对于任意一个原节点 S,其拷贝节点 S′ 即为其后继节点。

这样,我们可以直接找到每一个拷贝节点 S′ 的随机指针应当指向的节点,即为其原节点 S 的随机指针指向的节点 T 的后继节点 T′。需要注意原节点的随机指针可能为空,我们需要特别判断这种情况。

当我们完成了拷贝节点的随机指针的赋值,我们只需要将这个链表按照原节点与拷贝节点的种类进行拆分即可,只需要遍历一次。同样需要注意最后一个拷贝节点的后继节点为空,我们需要特别判断这种情况。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

class Solution {
    
public:
    Node* copyRandomList(Node* head) {
    
        if (head == nullptr) {
    
            return nullptr;
        }

        for (Node* node = head; node != nullptr; node = node->next->next) {
    
            Node* nodeNew = new Node(node->val);
            nodeNew->next = node->next;
            node->next = nodeNew;
        }
        
        for (Node* node = head; node != nullptr; node = node->next->next) {
    
            Node* nodeNew = node->next;
            nodeNew->random = (node->random != nullptr) ? node->random->next : nullptr;
        }

        Node* headNew = head->next;
        for (Node* node = head; node != nullptr; node = node->next) {
    
            Node* nodeNew = node->next;
            node->next = node->next->next;
            nodeNew->next = (nodeNew->next != nullptr) ? nodeNew->next->next : nullptr;
        }
        return headNew;
    }
};

原网站

版权声明
本文为[_索伦]所创,转载请带上原文链接,感谢
https://sauron7i.blog.csdn.net/article/details/125493687