版权声明:本文为博主原创文章,转载请注明。 https://blog.csdn.net/mrbacker/article/details/79731764
一、调整整数数组使奇数位于偶数前面
题目描述
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
算法思想
这题我的想法是遍历数组,遇到偶数就将该偶数后面的前移移位,并将该偶数移到最后面,给一个值标记第一个偶数移的位置,当遍历到第一个偶数就完成了。
class Solution {
public:
void reOrderArray(vector<int> &array) {
int size = array.size();
int i = 0;
int tmp;
while(i < size) {
while(array[i] % 2 == 0) {
tmp = array[i];
for(int j = i; j < array.size() - 1; j++) {
array[j] = array[j+1];
}
array[array.size() - 1] = tmp;
size--;
if(i == size)
return;
}
i++;
}
}
};
二、链表中倒数第K个结点。
题目描述
输入一个链表,输出该链表中倒数第k个结点。
算法描述
就是统计总共的节点数,再遍历n - k + 1
次,输出即可
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
int count = 0;
ListNode* p = pListHead;
while(p) {
count++;
p = p->next;
}
if(k > count)
return NULL;
p = pListHead;
for(int i = 1; i + k <= count; i++) {
p = p->next;
}
return p;
}
}
三、反转链表
题目描述
输入一个链表,反转链表后,输出链表的所有元素
算法描述
class Solution {
public:
ListNode* ReverseList(ListNode* pHead) {
if(!pHead)
return NULL;
ListNode *p = pHead->next;
if(!p)
return pHead;
ListNode *q = p->next;
pHead->next = NULL;
while(q && p) {
p->next = pHead;
pHead = p;
p = q;
q = q->next;
}
p->next = pHead;
return p;
}
};
四、合并两个排序的链表
题目描述
输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。
算法描述
两个链表1结点值小就选链表1结点,否则选链表2结点,当其中一个链表比较完,就将另外一个链表接到合成的链表后。
class Solution {
public:
ListNode* Merge(ListNode* pHead1, ListNode* pHead2) {
ListNode *Head;
ListNode *p = (ListNode*)malloc(sizeof(ListNode));
p->next = NULL;
Head = p;
ListNode *p1 = pHead1;
ListNode *p2 = pHead2;
while(p1 && p2) {
if(p1->val < p2->val) {
p->next = p1;
p1 = p1->next;
p = p->next;
}
else {
p->next = p2;
p2 = p2->next;
p = p->next;
}
}
if(p1)
p->next = p1;
if(p2)
p->next = p2;
return Head->next;
}
};
五、树的子结构
题目描述
输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
算法描述
六、二叉树的镜像
题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树
8
/ \
6 10
/ \ / \
5 7 9 11
镜像二叉树:
8
/ \
10 6
/ \ / \
11 9 7 5
###算法描述
遍历二叉树同时交换左右儿子
class Solution {
public:
void Mirror(TreeNode *pRoot) {
if(pRoot) {
TreeNode *p;
p = pRoot->left;
pRoot->left = pRoot->right;
pRoot->right = p;
Mirror(pRoot->left);
Mirror(pRoot->right);
}
}
};