算法训练|随机链表的复制、K个一组的翻转链表

138. 随机链表的复制 - 力扣(LeetCode)

总结:此题要求深拷贝,题解的思路非常棒,利用哈希表+回溯,因为不知道当前节点的next与random是否已构建,所以使用哈希表来判断;接着当我们构建完当前节点的值之后,利用回溯赋值当前的节点的next与random,最终返回当前节点,形成总体的递归。

代码:

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

        if(cachedNode.find(head) == cachedNode.end())
        {
            Node* headNew = new Node(head->val);
            cachedNode[head] = headNew;
            headNew->next = copyRandomList(head->next);
            headNew->random = copyRandomList(head->random);
        }
        return cachedNode[head];
    }
};

25. K 个一组翻转链表 - 力扣(LeetCode) 

总结:此题的关键是利用递归+翻转链表,直接看代码比较容易理解。

class Solution {
public:
    ListNode* reverseKGroup(ListNode* head, int k) {
        ListNode* tail = head;
        for(int i = 0;i < k;i++)
        {
            if(tail == nullptr)
            return head;

            tail = tail->next;
        }

        ListNode* pre = nullptr;
        ListNode* cur = head;
        while(cur != tail)
        {
            auto temp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = temp;
        }
        
        head->next = reverseKGroup(tail,k);
        return pre;
    }
};

 tail节点就是下k个节点中的头结点,完成当前k个节点的翻转后,pre节点就是当前翻转完后的头节点。

你可能感兴趣的:(算法,链表,数据结构)