复制复杂链表
要点:三个阶段:插入+复制值+复制next指针,复制random指针,断开。
#include<iostream>
using namespace std;
struct RandomListNode {
int label;
struct RandomListNode *next, *random;
RandomListNode(int x) :
label(x), next(NULL), random(NULL) {
}
};
class Solution {
public:
RandomListNode* Clone(RandomListNode* pHead)
{
if (pHead == NULL) {
RandomListNode* r = NULL;
return r;
}
RandomListNode *tmp = pHead, *t;
while (tmp != NULL) {
t = new RandomListNode(tmp->label);
t->next = tmp->next;
tmp->next = t;
tmp = t->next;
}
tmp = pHead;
while (tmp != NULL) {
tmp->next->random = tmp->random->next;
tmp = tmp->next->next;
}
t = pHead->next;
RandomListNode *t1 = pHead, *t2 = t;
while (t2 != NULL) {
t1->next = t2->next;
if (t2->next == NULL)break;
else t2->next = t2->next->next;
t1 = t1->next;
t2 = t2->next;
}
return t;
}
};
int main()
{
Solution x;
RandomListNode *tmp, *root, *c;
root = new RandomListNode(-1);
c = root;
for (int i = 0;i < 3;i++) {
tmp = new RandomListNode(i);
c->next = tmp;
c->random = root;
c = c->next;
}
tmp->random = root;
c = x.Clone(root);
return 0;
}
由上到下打印二叉树
class Solution {
public:
vector<int> PrintFromTopToBottom(TreeNode* root) {
vector<int> v;
if(root==NULL)return v;
queue<TreeNode*> q;
q.push(root);
while(!q.empty()){
TreeNode* tmp=q.front();
if(tmp->left!=NULL)q.push(tmp->left);
if(tmp->right!=NULL)q.push(tmp->right);
q.pop();
v.push_back(tmp->val);
}
return v;
}
};
检验栈的弹出序列
要点:注意终止条件
class Solution {
public:
bool IsPopOrder(vector<int> pushV,vector<int> popV) {
if(popV.size()==0)return true;
stack<int> s;
int i1=1, i2=0;
s.push(pushV[0]);
for(i2;i2<popV.size();i2++){
while(s.top()!=popV[i2]){
if(i1==pushV.size())return false;
s.push(pushV[i1]);
i1++;
}
if(s.empty())return false;
s.pop();
}
return true;
}
};