有关链表的练习题。


刚刚学了线性表,会了一些基本操作,现在来做一些经典面试题来巩固一下知识。

一。打印链表从尾到头。

//(1)从尾到头打印单链表。普通法:
void Print(SListNode *pFirst)
{
	SListNode *end=NULL;         //定义指针指向空。
	SListNode *pNode=pFirst;    //定义指针指向头结点。
	while(end!=pFirst)             //当end不为头结点时。
	{
		while(pNode->pNext!=end)   //将pNode移到end的前一个节点处。
		{
			pNode=pNode->pNext;
		}
		end=pNode;                  //将pNode赋给end。
		pNode=pFirst;               //将pNode赋成头结点打印出此时的值,继续循环。
		printf("%d ",end->data);
	}
	printf("\n");
}

//(2)递归法:
void Printf(SListNode *pFirst)
{
	if(pFirst->pNext)
	{
		Printf(pFirst->pNext);
	}
	printf("%d ",pFirst->data);
}

二。逆置链表。

void Reverse(SListNode *pFirst)
{
	SListNode *pNode=pFirst;
	SListNode *p1=NULL;                 //先定义三个连续的指针变量,中间指向第一个节点。    
	SListNode *p2=pFirst;
	SListNode *p3=pFirst->pNext;
	while(p2)                          //当p2不为空时,将p2的pNext赋值成p1,再将三个指针向后移一位。
	{
		p2->pNext=p1;
		p1=p2;
		p2=p3;
		if(p3!=NULL){                    //这时要注意如果p3为空,就跳出,不为空在向后移。
		p3=p3->pNext;
		}
	}
	for(pNode=pFirst;pNode!=NULL;pNode=pNode->pNext)   //打印出此时已逆置的链表。
	{
		printf("%d ",pNode->data);
	}
	printf("\n");
}

三。删除一个无头单链表的非尾结点。(不能遍历链表)


void NofrontSList(SListNode *pPos)
{
	SListNode *pNode=pPos;            //定义指针指向指定节点。
	SListNode *n=NULL;                //定义空指针。
	n=pPos->pNext;                    //使它指向指定节点的下一个节点。
	pNode->data=n->data;              //将指定节点替换成指定节点下一个节点。
	pNode->pNext=n->pNext;
	free(n);                           //最后释放这个指定节点的下一个节点。
}

四。在无头单链表的一个节点前插入一个节点。


//无头单链表的一个节点前插入一个节点(不能遍历链表)。
void InesrtSList(SListNode *pPos,DataType data)
{
	SListNode *pNewNode=(SListNode *)malloc(sizeof(SListNode));   //先开辟一个空间。
	assert(pPos);
	pNewNode->data=pPos->data;              //将所选的的节点放入这个新空间。
	pNewNode->pNext=pPos->pNext;

	pPos->data=data;                        //再将插入的节点放入所选节点中。
	pPos->pNext=pNewNode;
}
今天就先做着四个题,这些都是很简单的面试题,下次会分享一些更有意思,更困难的面试题。

猜你喜欢

转载自blog.csdn.net/ymk1507050118/article/details/80737108