刚刚学了线性表,会了一些基本操作,现在来做一些经典面试题来巩固一下知识。
一。打印链表从尾到头。
//(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;
}
今天就先做着四个题,这些都是很简单的面试题,下次会分享一些更有意思,更困难的面试题。