目录
day2:
一. 剑指 Offer 06. 从尾到头打印链表
题目:
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。
示例:
输入: head = [1,3,2]
输出: [2,3,1]
解题思路:
因为链表只能 从前向后 访问每个节点,而题目要求 倒序输出 各节点值,结合day1学习的栈——先入后出,可以先将链表的每个节点值push栈中,然后将栈中的存入的每个节点值pop出栈,存入数组中然后返回。
c++代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
vector<int> reversePrint(ListNode* head) {
stack<int> A;
while(head != nullptr)
{
A.push(head -> val);
head = head -> next;
}
vector<int> arr;
while(!A.empty())
{
arr.push_back(A.top());
A.pop();
}
return arr;
}
};
二. 剑指 Offer 24. 反转链表
题目:
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
解题思路:
采用双指针法。
C++代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode *l = head, *r = nullptr;
while(l != nullptr)
{
ListNode *temp = l -> next;
l -> next = r;
r = l;
l = temp;
}
return r;
}
};
三. 剑指 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]]
解题思路:
1. 复制各个节点,并构造拼接
2. 构造新节点的random的指向
3. 拆分链表
c++代码:
/*
// 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 == nullptr) return nullptr;
Node *cur = head;
//复制各个节点,并将构建拼接
while(cur != nullptr)
{
//定义构造函数初始化节点
Node *temp = new Node(cur -> val);
temp -> next = cur -> next;
cur -> next = temp;
cur = temp -> next;
}
//构建新节点的random指向
cur = head;
while(cur != nullptr)
{
if(cur -> random != nullptr)
{
cur -> next -> random = cur -> random -> next;
}
cur = cur -> next -> next;
}
//拆分链表
cur = head -> next;
Node *pre = head, *res = head -> next;
while(cur -> next != nullptr)
{
pre -> next = pre -> next -> next;
cur -> next = cur ->next ->next;
pre = pre -> next;
cur = cur -> next;
}
cur -> next = nullptr;
pre -> next = nullptr;
return res;
}
};
题目源自: