剑指Offer | day2-链表(基本操作)

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


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


示例 :

输入:head = [1,3,2]
输出:[2,3,1]

限制:

0 <= 链表长度 <= 10000

说明:

带头节点与不带头节点的链表结构如图所示。经过测试,本题是不带头节点的链表。


方法一:数组

思路:自然而然地想到,用数组顺序接收链表的值,然后reverse,返回反转后的数组。

class Solution {
public:
    vector<int> reversePrint(ListNode* head) {
        // 按顺序将节点都放入数组
        vector<int> v;
        while(head != nullptr) {
            v.push_back(head->val);
            head = head->next;
        }
        
        // 反转数组
        reverse(v.begin(), v.end());
        return v;
    }
};

方法二:递归

思路:



剑指 Offer 24. 反转链表


定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。


示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

限制:

0 <= 节点个数 <= 5000

方法一:头插法

思路:

class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* list = new ListNode(0);
        while(head != nullptr) {
            // 创建新节点接收 head 链表的节点
            ListNode* node = new ListNode(0);
            node->val = head->val;
            head = head->next;

            // 将新链表插入 list 的后面
            node->next = list->next;
            list->next = node;
        }
        // 返回 list 的后面
        return list->next;
    }
};

方法二:递归



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


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


示例 :

输入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
输出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

提示:

  • -10000 <= Node.val <= 10000
  • Node.random 为空(null)或指向链表中的节点。
  • 节点数目不超过 1000 。

方法一:hashmap

思路:根据原链表,利用hashmap一一对应的特性,建立一个新链表并处理新链表中的指向关系。

class Solution {
public:
    Node* copyRandomList(Node* head) {
        Node* cur = head;

        // 1.建立一个hash map,key是现在的节点,value是复制的节点
        unordered_map<Node*, Node*> map;
        while(cur != nullptr) {
            map[cur] = new Node(cur->val);
            cur = cur->next;
        }

        // 2.然后 value 来复制 key 的 next 和 random
        cur = head;
        while(cur != nullptr) {
            map[cur]->next = map[cur->next];
            map[cur]->random = map[cur->random];
            cur = cur->next;
        }
        // 3.返回 key 为 head 对应的 value map[head]
        return map[head];
    }
};

方法二:原地复制

posted @ 2021-09-28 21:13  不是勇士  阅读(32)  评论(0)    收藏  举报