复杂链表的复制
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
实现思路
由于该链表不是普通的链表,复制过程中还要对特殊指针进行复制,所以我们在原链表上操作要分多次。刚开始的时候首先将链表上的节点值进行复制,并放置在对应结点之后。
然后再度遍历,这时候对random指针赋值,复制节点的random指针正好和它的前一个节点的random指针指向的位置一样。
最后对链表进行拆分,链表的偶数位置连接起来即为我们复制的链表。
具体实现
/*
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) return NULL;
RandomListNode* curNode=pHead;
while(curNode){
RandomListNode* node = new RandomListNode(curNode->label);
node->next=curNode->next;
curNode->next=node;
curNode=node->next;
}
curNode=pHead;
while(curNode){
RandomListNode* node = curNode->next;
if(curNode->random){
node ->random = curNode->random->next;
}
curNode=node->next;
}
RandomListNode* cloneHead = pHead->next;
curNode = pHead;
RandomListNode* tmp;
while(curNode->next){
tmp = curNode->next;
curNode->next = tmp->next;
curNode=tmp;
}
return cloneHead;
}
};
二叉搜索树与双向链表
题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
具体实现
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Solution {
public:
TreeNode* Convert(TreeNode* pRootOfTree){
TreeNode* res = NULL;
TreeNode* pre = NULL;
stack<TreeNode*> s;
while(pRootOfTree||!s.empty()){
while(pRootOfTree){
s.push(pRootOfTree);
pRootOfTree=pRootOfTree->left;
}
if(!s.empty()){
pRootOfTree = s.top();
s.pop();
if(pre!=NULL){
pre->right=pRootOfTree;
pRootOfTree->left=pre;
}
else{
res = pRootOfTree;
}
pre = pRootOfTree;
pRootOfTree = pRootOfTree->right;
}
}
return res;
}
};
字符串的排列
题目描述
输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。
输入描述:
输入一个字符串,长度不超过9(可能有字符重复),字符只包括大小写字母。
具体实现
class Solution {
public:
vector<string> Permutation(string str) {
vector<string> result;
if(str.empty()) return result;
f(str,result,0);
sort(result.begin(),result.end());
return result;
}
void f(string str,vector<string> &result, int begin){
if(begin==str.size()-1){
if(find(result.begin(),result.end(),str)==result.end()){
result.push_back(str);
}
}
else{
for(int i=begin;i<str.size();i++){
swap(str[i],str[begin]);
f(str,result,begin+1);
swap(str[i],str[begin]);
}
}
}
void swap(char &fir, char &sec){
char tmp = fir;
fir = sec;
sec = tmp;
}
};