C语言实现单链表面试题汇总

这篇博客主要聚焦于C语言实现的单链表面试题目,包括从尾到头打印链表、删除非尾节点、插入节点、约瑟夫环问题、链表反转、冒泡排序链表、合并有序链表、寻找中间节点、倒数第k个节点、判断链表环、求环入口点、链表相交点判断及计算等实战题目的详细解答。
摘要由CSDN通过智能技术生成

这篇博客只有针对单链表的不同面试题的不同函数,没有对单链表的具体实现方法的介绍。
单链表的具体实现方法(创建,初始化,前插,后插,删除,插入,销毁等),可以参考我的另一边博客:
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)
//  {
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值