今天又做了几道还挺简单的链表和二叉树的题,来这里跟大家分享一下。
1.分割链表。
//分割链表。小于给定值的节点在大于等于给定值的节点前面。
//如1-4-2-3-5 变换后:1-2-4-3-5.
SListNode *partition(SListNode *head, int x)
{
SListNode *p=head; //定义三个节点。
SListNode *q=NULL;
SListNode *m=NULL;
if(head==NULL){ //若为空,直接退出。
return NULL;
}
while(p){ //先循环找出大于x的节点。
if(p->data<x){
SListPushBack(&q,p->data); //逐一进行尾插到新的链表里。
p=p->pNext;
}
else{p=p->pNext;}
}
p=head;
while(p){ //在循环将剩下的节点尾插到新链表即可。
if(p->data>=x){
SListPushBack(&q,p->data);
p=p->pNext;
}
else{p=p->pNext;}
}
return q; //返回新链表的头结点。
}
2.旋转链表。
//旋转链表。如:1-2-3-4-5-NULL 旋转成:4-5-1-2-3-NULL
SListNode *rotateRight(SListNode *head, int k) {
int n=0;
int m=0; //用来计数。
SListNode *p=head;
SListNode *a=head;
SListNode *q=NULL;
SListNode *b=NULL;
while(p){ //先求出链表长度。
p=p->pNext;
n++;
}
p=head;
m=n-k; //求出p指针先走的步数。P走到了该旋转的节点的前一个节点。
while(m>1){
p=p->pNext;
m--;
}
q=p->pNext; //令这个节点的next位空,并且提前记下原next节点。
b=q;
p->pNext=NULL;
while(k>1){ //再循环找到最后一个节点
q=q->pNext;
k--;
}
q->pNext=a; //让其next为原头结点即可完成旋转。
return b;
}
3.求二叉树的镜像。
//求二叉树的镜像。
TreeNode *Mirror(TreeNode *pRoot)
{
TreeNode *p=pRoot; //定义一个变量。
if(pRoot==NULL) //若为空树返回空。
{
return NULL;
}
p=pRoot->pleft; //交换左右子树。
pRoot->pleft=pRoot->pright;
pRoot->pright=p;
Mirror(pRoot->pleft); //递归左右子树。
Mirror(pRoot->pright);
return pRoot; //返回根节点。
}
今天的练习就这些,希望大家能好好练习。