数据结构练习题(续)

今天又做了几道还挺简单的链表和二叉树的题,来这里跟大家分享一下。

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;               //返回根节点。
}

今天的练习就这些,希望大家能好好练习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值