链表面试题

#define _CRT_SECURE_NO_WARNINGS 1
#ifndef __SLIST_H__
#define __SLIST_H__

#include<stdio.h>
#include<string.h>
#include<assert.h>
#include<stdlib.h>

typedef int DataType;

typedef struct SList
{
    struct SList* pNext;
    DataType data;
}SList;
//初始化
void Init(SList **ppHead);
//创建新的空间
static SList* BuyNewNode(DataType data);
//销毁
void Destroy(SList* *ppHead);
//头插
void pushfront(SList* *ppHead,DataType data);
//尾插
void pushback(SList* *ppHead,DataType data);
//查找
SList *Find(SList *pHead,DataType data);
//指定位置插
void insert(SList **ppHead,SList *pPosNode,DataType data);
//头删
void popfront(SList **ppHead);
//指定位置删
void popPos(SList **ppHead,SList *pPosNode);
//按值删除,删除第一个找到的
void Remove(SList **ppHead,DataType data);
//按值删除,删除所有的
void RemoveAll(SList **ppHead,DataType data);
//计算链表的数量
int Size(SList **ppHead);
//打印
void Print(SList* pHead);


//面试题
//从尾到头打印链表
void RreversePrintD(SList* pHead);//递归
void RreversePrint(SList* pHead);//循环
//逆置/反转单链表
SList* Reverse(SList* pFirst); //改变箭头方向
SList* Reverse1(SList* pFirst); //头删、头插
//删除一个无头单链表的非尾节点(不能遍历链表)
void PopNoBack(SList* pPos);
//在无头单链表的一个节点前插入一个节点(不能遍历链表)
void PushNoBack(SList* pPos,DataType data);
//单链表实现约瑟夫环
int JosCircle(SList* pFirst,int k);
//单链表排序(冒泡法)
void BubbleSort(SList* pFirst);
//合并两个有序链表,合并后依然有序
SList* SortList(SList* pOneFirst, SList* pTwoFirst);
//查找单链表中的中间结点,要求只能遍历一次链表
int FindMid(SList* pFirst);
//查找单链表中的倒数第k个结点,要求只能遍历一次链表
int Findk(SList* pFirst,int k);
//删除单链表中的倒数第k个结点
void Popk(SList* pFirst,int k);
//求两个已排序链表中的相同数据
int UnionSet(SList* pOneFirst, SList* pTwoFirst);
//判断两个链表是否相交,若相交,求交点(假设链表不带环)
int HasCrossWithoutCircle(SList *pOneFirst, SList *pTwoFirst);
//判断单链表是否带环,若带环,求环的长度,求环的入口点

void test();
void testBubbleSort();
void testSortList();
void testFindMid();
void testFindk();
void testPopk();
void testUnionSet();
void testHasCrossWithoutCircle(); 



#endif //__SLIST_H__


#define _CRT_SECURE_NO_WARNINGS 1
#include"slist.h"
//³õʼ»¯
void Init(SList * *ppHead)
{
    *ppHead = NULL;
}
//´´½¨ÐµĿռä
static SList* BuyNewNode(DataType data)
{
    SList* pNewNode;
    pNewNode = (SList*)malloc(sizeof(SList));
    assert(pNewNode);
    pNewNode->data = data;
    pNewNode->pNext = NULL;
    return pNewNode;
}
//Ïú»Ù
void Destroy(SList* *ppHead)
{
    SList *pNode;
    SList *pNext = NULL;
    for(pNode=*ppHead; pNode!=NULL; pNode=pNext)
    {
        free(pNode);
        pNode = NULL;
    }
}
//Í·²å
void pushfront(SList* *ppHead,DataType data)
{
    SList* pNewNode;
    pNewNode = BuyNewNode(data);
    pNewNode->pNext = *ppHead;
    *ppHead = pNewNode;
}

//β²å
void pushback(SList* *ppHead,DataType data)
{
    SList* pNode = *ppHead;
    SList* pNewNode = BuyNewNode(data);
    if(pNode == NULL)
    {
        pNode = pNewNode;
        pNode->pNext = NULL;
        *ppHead = pNode;
        return;
    }
    while(pNode->pNext != NULL)
    {
        pNode = pNode->pNext;
    }
    pNewNode->pNext = pNode->pNext;
    pNode->pNext = pNewNode;
} 
//²éÕÒ
SList *Find(SList *pHead,DataType data)
{
    SList *pNode = pHead;
    while(pNode != NULL)
    {
        if(pNode->data == data)
            return pNode;
        pNode = pNode->pNext;
    }
    return NULL;
}
//Ö¸¶¨Î»Öòå
void insert(SList **ppHead,SList *pPosNode,DataType data)
{
    SList *pNewNode = BuyNewNode(data);
    SList *pNode = *ppHead;
    assert(*ppHead != NULL);
    if(pNode == pPosNode)           
    {
        pushfront(&pNode,data);
        return;
    }
    while(pNode->pNext != pPosNode)
    {
        pNode = pNode->pNext;
    }
    pNewNode->pNext = pPosNode;
    pNode->pNext = pNewNode;
}
//ͷɾ
void popfront(SList **ppHead)
{
    SList *pNode = *ppHead;
    if(*ppHead == NULL) 
    {
        printf("ÎÞÐèɾ³ý\n");
        return;
    }
    *ppHead = pNode->pNext;
    free(pNode);        
    pNode = NULL;
}
//βɾ(ÕÒµ½µ¹ÊýµÚ¶þ¸ö)
void popback(SList **ppHead)
{
    SList *pNode = *ppHead;
    SList *pNext = NULL;    
    if(*ppHead == NULL)
    {
        printf("ÎÞÐèɾ³ý\n");
        return;
    }
    while(pNode->pNext->pNext != NULL)
    {
        pNode = pNode->pNext;
    }
    pNext = pNode->pNext;   
    pNode->pNext = NULL;
    free(pNext);
    pNext = NULL;
}
//Ö¸¶¨Î»ÖÃɾ
void popPos(SList **ppHead,SList *pPosNode)
{
    SList *pNode = *ppHead;
    if(*ppHead == NULL)
    {
        printf("ÎÞÐèɾ³ý\n");
        return;
    }
    if(pNode == pPosNode)
    {
        popfront(ppHead);
        return;
    }
    while(pNode->pNext != pPosNode)
    {
        pNode = pNode->pNext;
    }
    pNode->pNext = pPosNode->pNext;
    free(pPosNode);
    pPosNode = NULL;
}
//°´ÖµÉ¾³ý£¬É¾³ýµÚÒ»¸öÕÒµ½µÄ
void Remove(SList **ppHead,DataType data)
{
    SList *pDel = NULL;
    if(*ppHead == NULL)
    {
        printf("ÎÞÐèɾ³ý\n");
        return;
    }
    pDel = Find(*ppHead,data);
    popPos(ppHead,pDel);
}
//°´ÖµÉ¾³ý£¬É¾³ýËùÓеÄ
void RemoveAll(SList **ppHead,DataType data)
{
    SList *pNode = *ppHead;
    SList *pDel = NULL;
    if(*ppHead == NULL)
    {
        printf("ÎÞÐèɾ³ý\n");
        return;
    }
    while(pNode->pNext != NULL)
    {
        while(pNode->pNext->data != data)
        {
            pNode = pNode->pNext;
        }
        pDel = pNode->pNext;
        pNode->pNext = pDel->pNext;
        free(pDel);
        pDel = NULL;
    }
    if((*ppHead)->data == data)
    {
        pNode = *ppHead;
        *ppHead = pNode->pNext;
        free(pNode);
        pNode = NULL;
    }
}
//¼ÆËãÁ´±íµÄÊýÁ¿
int Size(SList **ppHead)
{
    int size = 0;
    SList *pNode = *ppHead;
    while(pNode != NULL)
    {
        size++;
        pNode = pNode->pNext;
    }
    return size;
}
//´òÓ¡
void Print(SList* pHead)
{
    SList* pNode;
    for(pNode=pHead; pNode!=NULL; pNode=pNode->pNext)
    {
        printf("%d->",pNode->data);
    }
}
//´Óβµ½Í·´òÓ¡Á´±í
void RreversePrintD(SList* pHead)
{
    SList* pNode = pHead;
    if(pNode == NULL)
    {
        printf("<-NULL");
        return;
    }
    if(pNode->pNext == NULL)
    {
        printf("<-%d",pNode->data);
        return;
    }
    if(pNode->pNext != NULL)
    {
        RreversePrintD(pNode->pNext);
        printf("<-%d",pNode->data);
    }
}
void RreversePrint(SList* pHead)
{
    SList* pNode = pHead;
    SList* pEnd = NULL;
    if(pNode == NULL)
    {
        printf("<-NULL");
        return;
    }
    while(pEnd != pHead)
    {
        for(pNode = pHead;pNode->pNext != pEnd;pNode = pNode->pNext)
        {
            ;
        }
        printf("<-%d",pNode->data);
        pEnd = pNode;
    }
}
//ÄæÖÃ/·´×ªµ¥Á´±í
SList* Reverse(SList* pFirst)
{
    SList* p1 = NULL;
    SList* p2 = pFirst;
    SList* p3 = p2->pNext;
    while(p2 != NULL)
    {
        p2->pNext = p1;//¸Ä±ä¼ýÍ··½Ïò
        p1 = p2;
        p2 = p3;
        if(p2 != NULL)
        {
            p3 = p2->pNext;
        }
    }
    return p1;
}
SList* Reverse1(SList* pFirst) //ͷɾ¡¢Í·²å
{
    SList* pNode = pFirst;
    SList* pNew = NULL;
    SList* pNext = NULL;
    assert(pFirst != NULL);
    while(pNode != NULL)
    {
        pNext = pNode->pNext;
        pushfront(&pNew,pNode->data);
        pNode = pNext;
    }
    return pNew;
}
//ɾ³ýÒ»¸öÎÞÍ·µ¥Á´±íµÄ·Çβ½Úµã£¨²»ÄܱéÀúÁ´±í£©
void PopNoBack(SList* pPos)
{
    SList* pNext;
    assert(pPos != NULL);
    assert(pPos->pNext != NULL);
    pNext = pPos->pNext;
    pPos->data = pNext->data;
    pPos->pNext = pNext->pNext;
    free(pNext);
}
//ÔÚÎÞÍ·µ¥Á´±íµÄÒ»¸ö½ÚµãÇ°²åÈëÒ»¸ö½Úµã£¨²»ÄܱéÀúÁ´±í£©
void PushNoBack(SList* pPos,DataType data)
{
    SList*pNode;
    assert(pPos != NULL);
    pNode = BuyNewNode(pPos->data);
    if(pPos == NULL)
    {
        pushfront(&pPos,data);
        return;
    }
    pPos->data = data;
    pNode->pNext = pPos->pNext;
    pPos->pNext = pNode;
}
//µ¥Á´±íʵÏÖԼɪ·ò»·
int JosCircle(SList* pFirst,int k)
{
    SList* pCur = pFirst;
    SList* pPrev = NULL;
    int i=0;
    assert(pFirst != NULL);
    while(pCur->pNext != NULL)
    {
        pCur = pCur->pNext;
    }
     pCur->pNext = pFirst;//½«µ¥Á´±íÁ¬³É»·
     pCur = pFirst;
    while(pCur->pNext != pCur)
    {
        for(i = 0; i < k-1; i++)
        //ËäȻҪɱÊÇÑ­»·k´Î£¬µ«ÊÇÒª¸ü¸ÄÁ´±í£¬ÒªÕÒµ½Ç°Ò»¸ö£¬ËùÒÔk-1
        {
            pPrev = pCur;
            pCur = pCur->pNext;
        }
        //kill
        pPrev->pNext = pCur->pNext;
        free(pCur);
        //Ö¸ÏòÔ­À´µÄÏÂÏÂÒ»¸ö£¨ÏÖÔÚµÄÏÂÒ»¸ö£©
        pCur = pPrev->pNext;
    }
    return pCur->data;
}

void test()
{
    SList* psL = NULL;
    //SList* ret;
    int ret1 = 0;
    Init(&psL);
    pushback(&psL,1);
    pushback(&psL,3);
    pushback(&psL,5);
    pushback(&psL,7);
    pushback(&psL,2);
    Print(psL);
    printf("\n");
    /*pushfront(&psL,4);
    pushfront(&psL,3);
    pushfront(&psL,2);
    pushfront(&psL,1);
    Print(psL);
    printf("\n");*/
    //insert(&psL,Find(psL,6),45);
    //popfront(&psL);
    //popback(&psL);
    //popPos(&psL,Find(psL,6));
    //Remove(&psL,3);
    //RemoveAll(&psL,3);
    //RreversePrintD(psL);
    //RreversePrint(psL);
    //ret = Reverse(psL);
    //Print(ret);
    //ret = Reverse1(psL);
    //PopNoBack(Find(psL,2));
    //PushNoBack(Find(psL,3),23);
    //Print(psL);
    //ret1 = JosCircle(psL,3);
    //printf("%d\n",ret1);
    Destroy(&psL);
}


#define _CRT_SECURE_NO_WARNINGS 1
#include"slist.h"
int main()
{
    //test();
    //testBubbleSort();
    //testSortList();
    testFindMid();//ÓÐÎÊÌâ
    //testFindk();
    //testPopk();
    //testUnionSet();
    //testHasCrossWithoutCircle();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值