这篇博客只有针对单链表的不同面试题的不同函数,没有对单链表的具体实现方法的介绍。
单链表的具体实现方法(创建,初始化,前插,后插,删除,插入,销毁等),可以参考我的另一边博客:
http://blog.csdn.net/ljx_5489464/article/details/50893430
以下是单链表面试题的具体实现:
1、从尾到头打印单链表
void PrintListTailToHead(PSListNode pHead)
{
if (NULL != pHead)
{
//递归实现
PrintListTailToHead(pHead->pNextNode);
printf("%d ", pHead->data);
}
}
2、删除一个无头单链表的非尾节点
void DelNotTailNode(PSListNode pos)
{
PSListNode pNode = NULL;
assert(pos);
if (NULL == pos->pNextNode)
{
return;
}
else
{
DataType temp = 0;
//交换pos和pos->pNextNode的数据(相当于交换了两个结点的位置),使问题转换为删除pos指向的结点的下一个结点
temp = pos->data;
pos->data = pos->pNextNode->data;
pos->pNextNode->data = temp;
pNode = pos->pNextNode;
pos->pNextNode = pos->pNextNode->pNextNode;
free(pNode);
pNode = NULL;
}
}
3、在无头单链表的一个非头节点前插入一个节点
void InsertNotHead(PSListNode pos, DataType data)
{
if (NULL == pos)
{
return;
}
else
{
PSListNode pNewNode = ByeNode(data);
if (NULL == pNewNode)
{
printf("开辟结点空间失败!\n");
return;
}
else
{
//交换pos和pNewNode的数据(相当于交换了两个结点的位置),使问题转换为在pos指向的结点的下一个结点处插入新结点
pNewNode->data = pos->data;
pos->data = data;
pNewNode->pNextNode = pos->pNextNode;
pos->pNextNode = pNewNode;
}
}
}
4、单链表实现约瑟夫环(JosephCircle)
//使链表形成一个环
void FormCyc(PSListNode *pHead)
{
if (NULL == pHead)
{
return;
}
else
{
PSListNode pNode = *pHead;
while (NULL != (pNode->pNextNode))
{
pNode = pNode->pNextNode;
}
pNode->pNextNode = *pHead;
}
}
PSListNode JosephCircle(PSListNode pHead, int M)
{
if ((NULL == pHead) || (M <= 0))
{
return NULL;
}
else
{
//让链表中所有元素形成一个环
FormCyc(&pHead);
PSListNode pPreNode = NULL;
PSListNode pCurNode = pHead;
PSListNode pDesNode = NULL;
int temp = M;
while (pCurNode->pNextNode != pCurNode)
{
temp = M;
pPreNode = pCurNode;
while (--temp)
{
pPreNode = pCurNode;
pCurNode = pCurNode->pNextNode;
}
//记住要从链表中删除的节点的位置,把它的空间释放了
pDesNode = pCurNode;
pCurNode = pCurNode->pNextNode;
pPreNode->pNextNode = pCurNode;
free(pDesNode);
pDesNode = NULL;
}
//如果M=1,就说明所有结点都要被删除,那么就返回空,否则就返回剩下的那个结点的指针
if (1 == M)
{
free(pCurNode);
pCurNode = NULL;
}
else
{
pCurNode->pNextNode = NULL;
}
return pCurNode;
}
}
5、逆置/反转单链表
逆置链表:方法一:前插法
//void ReverseList(PSListNode* pHead)
//{
// if (NULL == *pHead)
// {