一些数据结构练习题

今天来做一些题目来巩固一下所学的知识。

1.删除链表中重复的节点。

//删除链表中重复的节点。
SListNode* deleteDuplication(SListNode* pHead)
    {
        SListNode *p1=pHead;           //定义快慢指针p1,p2。
        SListNode *p2=pHead;
        SListNode *q;                //用来标记的指针。
        SListNode *m=pHead;
        if(pHead==NULL){            //如果是空链表直接返回空。
            return NULL;
        } 
		p2=p2->pNext;               //先让快指针先走一步。
        while(p2!=NULL){
            if(p2->data!=p1->data){     //如果两个结点不重复,快慢指针同时往后走一位。
				p1=p1->pNext;
                p2=p2->pNext;
				
				/*SListErase(&m,p2);
				p2=p1->pNext;*/
            }
            else{                     //若重复,进行删除。
				q=p2;
                p2=p2->pNext;
                p1->pNext=p2;
                free(q);
            }
        }
        return m;                    //返回头指针即可。
        
	}

2.按照要求重新排序链表。

//将链表按照0->n->1->n-1->...的顺序整理。
//如:原链表:1 2 3 4 5 6 7,转换后:1 7 2 6 3 5 4.
SListNode *Rsort(SListNode *pFirst)
{
	int n=0;                  //记录链表的长度。
	SListNode *p=pFirst;      //所需要的指针变量。
	SListNode *m=pFirst;           
	SListNode *q;
	SListNode *a;
	if(pFirst==NULL)           //当为空表时返回空。
	{
		return NULL;
	}
	while(p!=NULL)                //循环得到链表长度。
	{
		SListPushFront(&q,p->data);     //同时进行头插,组成新的链表。
		p=p->pNext;
		n++;
	}
	n=n/2;              //表示还需进行插入的次数。
	p=pFirst;           //将p重新指向头结点。
	while(n>0)                //在计算的次数内进行操作。
	{
		a=p->pNext;                  //先记录下原链表的下一个节点。
		if(a->data==q->data)                //若q节点的值与下一个节点相同,则直接进行尾插即可。
		{
			p->pNext=NULL;
			SListPushBack(&p,q->data);
			break;
		}
		SListInsert(&p,a,q->data);         //按照节点插入。
		p=a;
		q=q->pNext;
		n--;
	}
	p->pNext=NULL;                  //最后将链表后面的值去掉。
	return m;                      //返回头结点。
}

3.判否是平衡二叉树。

//求树的深度。
int TreeHeight(TreeNode *pRoot)
{
	int left;
	int right;
	if(pRoot==NULL)
	{
		return 0;
	}
	left=TreeHeight(pRoot->pleft);
	right=TreeHeight(pRoot->pright);
	return (left>right ? left+1 : right+1);
}


//判断是否是平衡二叉树。
int TreeIsBalance(TreeNode *pRoot)
{
	int left,right,x,y;              //定义变量。
	if(pRoot==NULL)                  //若为空返回1.
	{
		return 1;
	}
	left=TreeIsBalance(pRoot->pleft);      //判断左子树是否平衡。
	if(left==0)
	{
		return 0;
	}
	right=TreeIsBalance(pRoot->pright);    //判断右子树是否平衡。
	if(right==0)
	{
		return 0;
	}
	x=TreeHeight(pRoot->pleft);        //求左右子树的深度。
	y=TreeHeight(pRoot->pright);
	if(x-y>=-1 && x-y<=1)             //深度之间的差值不超过1.
	{
		return 1;
	}
	return 0;
}

以上就是今天的代码练习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值