今天来做一些题目来巩固一下所学的知识。
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;
}
以上就是今天的代码练习。