剑指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 <= 10000Node.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];
}
};
方法二:原地复制
空

浙公网安备 33010602011771号