单链表问题集合

主要解决的问题有

// 逆序打印单链表 
void PrintListFromTail2Head(PNode pHead);

// 删除单链表的非尾结点 
void DeleteNonEnd(PNode pos);

// 在无头单链表某节点前插入值为data新节点 
void InsertFront(PNode pos, DataType data);

// 用单链表模拟实现约瑟夫环 
void JosephCircle(PNode* ppHead, size_t M);

// 单链表的逆置--三个指针 
void ReverseList(PNode* ppHead);

// 单链表的逆置---头插法 
PNode ReverseList_P(PNode pHead);

// 使用冒泡排序对单链表进行排序 
void BubbleSort(PNode pHead);

// 查找单链表的中间结点,要求只能遍历一次链表 
PNode FindMiddleNode(PNode pHead);

// 查找链表的倒数第K个结点 
PNode FindLastKNode(PNode pHead, size_t K);

// 删除单链表的倒数第K个结点 
int DeleteLastKNode(PNode* ppHead, size_t K);

// 合并两个已序链表,合并之后依然有序 
PNode MergeList(PNode pHead1, PNode pHead2);

// 判断单链表是否带环 
PNode HasCircle(PNode pHead);

// 求环的长度 
size_t GetCircleLen(PNode pHead);

// 求环的入口点 
PNode GetEnterNode(PNode pHead, PNode pMeetNode);

// 判断两个不带环单链表是否相交?若干相交求交点 
int IsCrossWithoutCircle(PNode pHead1, PNode pHead2);
PNode GetCorssNode(PNode pHead1, PNode pHead2);

代码实现

编译环境(Visual Studio 2017)

  • test.c 文件
#include <windows.h>
#include <stdio.h>
#include <assert.h>
#include <malloc.h>
#include "List.h"


int main()
{
    // 逆序打印单链表 测试
    PrintListFromTail2Head_test( );

    // 删除单链表的非尾结点 测试
    DeleteNonEnd_test( );

    // 在无头单链表某节点前插入值为data新节点 测试
    InsertFront_test();

    // 用单链表模拟实现约瑟夫环 测试
    JosephCircle_test();

    // 单链表的逆置--三个指针 测试
    ReverseList_test();

    // 单链表的逆置--头插法 测试
    ReverseList_p_test();

    // 使用冒泡排序堆单链表进行排序 测试
    BubbleSort_test();

    // 查找单链表的中间结点,要求只能遍历一次链表 测试
    FindMiddleNode_test( );

    // 查找链表的倒数第K个结点 测试
    FindLastKNode_test( );

    // 删除单链表的倒数第K个结点 测试
    DeleteLastKNode_test( );

    // 合并两个已序链表,合并之后依然有序 测试
    MergeList_test( );

    // 判断单链表是否带环 测试
    HasCircle_test( );

    // 求环的长度 测试
    GetCircleLen_test( );

    // 求环的入口点 测试
    GetEnterNode_test( );

    // 判断两个不带环单链表是否相交?若干相交求交点 测试
    IsCrossWithoutCircle_test( );


    system("pause");
    return 0;

}
  • List.h 文件
#pragma once

#ifndef _SLISTNODE_H_
#define _SLISTNODE_H_

typedef int DataType;

typedef struct SListNode
{
    DataType _data;
    struct SListNode* _pNext; // 指向下一个结点的指针 
}Node, *PNode;


// 初始化单链表 
void SListInit(PNode* ppHead);

// 尾插 
void SListPushBack(PNode* ppHead, DataType data);

// 尾删 
void SListPopBack(PNode* ppHead);

// 头插 
void SListPushFront(PNode* ppHead, DataType data);

// 头删 
void SListPopFront(PNode* ppHead);

// 在链表中查找元素data,返回该结点在链表中的位置 
PNode Find(PNode pHead, DataType data);

// data插入在pos之前 
void SListInsert(PNode* ppHead, PNode pos, DataType data);

// 删除链表中pos位置的结点 
void SListErase(PNode* ppHead, PNode pos);

// 获取链表中结点的个数 
size_t Size(PNode pHead);

// 销毁单链表 
void SListDestroy(PNode* pHead);

// 创建结点 
PNode BuySListNode(DataType data);

// 打印单链表 
void SListPrint(PNode pHead);




///////////////////////////////////////////////////////////////////

// 逆序打印单链表 
void PrintListFromTail2Head(PNode pHead);

// 删除单链表的非尾结点 
void DeleteNonEnd(PNode pos);

// 在无头单链表某节点前插入值为data新节点 
void InsertFront(PNode pos, DataType data);

// 用单链表模拟实现约瑟夫环 
void JosephCircle(PNode* ppHead, size_t M);

// 单链表的逆置--三个指针 
void ReverseList(PNode* ppHead);

// 单链表的逆置---头插法 
PNode ReverseList_P(PNode pHead);

// 使用冒泡排序对单链表进行排序 
void BubbleSort(PNode pHead);

// 查找单链表的中间结点,要求只能遍历一次链表 
PNode FindMiddleNode(PNode pHead);

// 查找链表的倒数第K个结点 
PNode FindLastKNode(PNode pHead, size_t K);

// 删除单链表的倒数第K个结点 
int DeleteLastKNode(PNode* ppHead, size_t K);

// 合并两个已序链表,合并之后依然有序 
PNode MergeList(PNode pHead1, PNode pHead2);

// 判断单链表是否带环 
PNode HasCircle(PNode pHead);

// 求环的长度 
size_t GetCircleLen(PNode pHead);

// 求环的入口点 
PNode GetEnterNode(PNode pHead, PNode pMeetNode);

// 判断两个不带环单链表是否相交?若干相交求交点 
int IsCrossWithoutCircle(PNode pHead1, PNode pHead2);
PNode GetCorssNode(PNode pHead1, PNode pHead2);

#endif
  • List.c 文件
#include <stdio.h>
#include <windows.h>
#include <assert.h>
#include <malloc.h>
#include "List.h"

///-----单链表基础功能
// 初始化单链表 
void SListInit(PNode* ppHead)
{
    *ppHead = NULL;
}

// 尾插 
void SListPushBack(PNode* ppHead, DataType data)
{
    assert(ppHead);
    PNode newP = BuySListNode(data);
    PNode P = *ppHead;
    if (*ppHead == NULL)
    {
        *ppHead = newP;
    }
    else
    {
        while (P->_pNext != NULL)
        {
            P = P->_pNext;
        }
        P->_pNext = newP;
    }
}

// 尾删 
void SListPopBack(PNode* ppHead)
{
    assert(ppHead);
    PNode Pre = NULL;
    PNode Del = NULL;
    if (*ppHead && (*ppHead)->_pNext == NULL)
    {
        free((*ppHead));
        *ppHead = NULL;
    }
    else if (*ppHead)
    {
        Del = *ppHead;
        while (Del->_pNext != NULL)
        {
            Pre = Del;
            Del = Del->_pNext;
        }
        Pre->_pNext = NULL;
        free(Del);
    }
}

// 头插 
void SListPushFront(PNode* ppHead, DataType data)
{
    assert(ppHead);
    PNode newP = BuySListNode(data);
    newP->_pNext = *ppHead;
    *ppHead = newP;
}

// 头删 
void SListPopFront(PNode* ppHead)
{
    assert(ppHead);

    PNode Del = NULL;
    if ((*ppHead) != NULL)
    {
        Del = *ppHead;
        *ppHead = (*ppHead)->_pNext;
        free(Del);
    }

}

// 在链表中查找元素data,返回该结点在链表中的位置 
PNode Find(PNode pHead, DataType data)
{
    while (pHead != NULL)
    {
        if (pHead->_data == data)
        {
            return pHead;
        }
        pHead = pHead->_pNext;
    }
    return NULL;
}

// data插入在pos之前 
void SListInsert(PNode* ppHead, PNode pos, DataType data)
{
    assert(ppHead);
    assert(pos);

    PNode Pnew = BuySListNode(data);
    PNode per = NULL;

    if (pos == *ppHead)
    {
        Pnew->_pNext = *ppHead;
        *ppHead = Pnew;
    }
    else
    {
        per = *ppHead;
        while (pos && per  && per->_pNext != pos)
        {
            per = per->_pNext;
        }
        if (per->_pNext == pos)
        {
            Pnew->_pNext = pos;
            per->_pNext = Pnew;
        }
    }
}

// 删除链表中pos位置的结点 
void SListErase(PNode* ppHead, PNode pos)
{
    assert(ppHead);
    PNode pre = *ppHead;

    if (pos == NULL || *ppHead == NULL)
    {
        return 0;
    }
    else if (pos == *ppHead)
    {
        *ppHead = pos->_pNext;
        free(pos);
    }
    else
    {
        while (pre && pre->_pNext != pos)
        {
            pre = pre->_pNext;
        }
        if (pre)
        {
            pre->_pNext = pos->_pNext;
            free(pos);
        }
    }
}


// 获取链表中结点的个数 
size_t Size(PNode pHead)
{
    size_t num = 0;
    while (NULL != pHead)
    {
        num++;
        pHead = pHead->_pNext;
    }
    return num;
}

// 销毁单链表 
void SListDestroy(PNode* pHead)
{
    assert(pHead);

    if ((*pHead) != NULL)
    {
        SListDestroy(&((*pHead)->_pNext));
    }
    if ((*pHead) != NULL)
    {
        free((*pHead));
    }
}


// 创建结点 
PNode BuySListNode(DataType data)
{
    PNode newP = NULL;
    newP = (PNode)malloc(sizeof(Node));
    if (newP == NULL)
    {
        printf("error\n");
        return 0;
    }
    newP->_data = data;
    newP->_pNext = NULL;
    return newP;
}

// 打印单链表 
void SListPrint(PNode pHead)
{
    printf("pHead --> ");
    while (pHead != NULL)
    {
        printf("%d --> ", pHead->_data);
        pHead = pHead->_pNext;
    }
    printf("NULL");
    printf("\n");
}



//-------面试题

// 逆序打印单链表 1
void PrintListFromTail2Head(PNode pHead)
{
    if(NULL != pHead && NULL != pHead->_pNext)
    {
        PrintListFromTail2Head(pHead->_pNext);
    }
    if(pHead != NULL)
    printf("%d ", pHead->_data);
}

 逆序打印单链表 2
//void PrintListFromTail2Head(PNode pHead)
//{
//  DataType arr[100];
//  int i = 0;
//
//  while (pHead)
//  {
//      arr[i++] = pHead->_data;
//      pHead = pHead->_pNext;
//  }
//
//  while (i)
//  {
//      printf("%d ", arr[--i]);
//  }
//  printf("\n");
//}

 逆序打印单链表 3
//void PrintListFromTail2Head(PNode pHead)
//{
//  PNode PN = NULL;//创建一个新链表
//  while (NULL != pHead)//将数据头插进新链表 
//  {
//      SListPushFront(&PN, pHead->_data);
//      pHead = pHead->_pNext;
//  }
//  SListPrint(PN);
//  SListDestroy(&PN);
//}

// 删除单链表的非尾结点 
void DeleteNonEnd(PNode pos)
{
    PNode Del = NULL; 
    if (NULL != pos->_pNext)
    {
        Del = pos->_pNext;
        pos->_data = Del->_data;
        pos->_pNext = Del->_pNext;
        free(Del);
    }
}


// 在无头单链表某节点前插入值为data新节点 
void InsertFront(PNode pos, DataType data)
{
    PNode pNew = NULL;
    if(NULL != pos)
    {
        pNew = BuySListNode(pos->_data);
        pos->_data = data;
        pNew->_pNext = pos->_pNext;
        pos->_pNext = pNew;
    }
}

// 用单链表模拟实现约瑟夫环 
void JosephCircle(PNode* ppHead, size_t M)
{
    PNode car = NULL;
    PNode Del = NULL;
    int  num = M;
    assert(ppHead);
    car = (*ppHead);

    if(M != 1)
    {
        while (car->_pNext != car)
        {
            num = M;
            while (--num > 1)
            {
                car = car->_pNext;
            }
            Del = car->_pNext;
            car->_pNext = Del->_pNext;
            car = car->_pNext;
            free(Del);
        }
        car->_pNext = NULL;
        (*ppHead) = car;
    }
    else if (M == 1)
    {
        PNode pre = (*ppHead);
        while (car->_pNext != pre)
        {
            Del = car;
            car = Del->_pNext;
            free(Del);
        }
        car->_pNext = NULL;
    }
    (*ppHead) = car;
}

// 单链表的逆置--三个指针 
void ReverseList(PNode* ppHead)
{
    PNode pre = NULL;
    PNode cur = NULL;
    PNode Next = NULL;

    assert(ppHead);

    cur = (*ppHead);
    while (cur != NULL)
    {
        Next = cur->_pNext;
        cur->_pNext = pre;
        pre = cur;
        cur = Next;
    }
    (*ppHead) = pre;
}

// 单链表的逆置---头插法 
PNode ReverseList_P(PNode pHead)
{
    PNode pNewHead = NULL;
    SListInit(&pNewHead);

    while (pHead)
    {
        SListPushFront(&pNewHead, pHead->_data);
        pHead = pHead->_pNext;
    }
    return pNewHead;
}

// 使用冒泡排序对单链表进行排序 
void BubbleSort(PNode pHead)
{
    PNode cur = pHead;
    PNode pre = pHead;
    PNode End = NULL;
    int flag = 1;
    DataType Ex = 0;

    while (pre && pre->_pNext && flag)
    {
        flag = 0;
        cur = pHead;
        while (cur &&  cur ->_pNext != End)
        {
            if (cur->_data > cur->_pNext->_data)
            {
                flag = 1;
                Ex = cur->_data;
                cur->_data = cur->_pNext->_data;
                cur->_pNext->_data = Ex;
            }
            cur = cur->_pNext;
        }
        End = cur;
        pre = pre->_pNext;
    }
}

// 查找单链表的中间结点,要求只能遍历一次链表 
PNode FindMiddleNode(PNode pHead)
{
    PNode pFast = pHead;
    PNode pSlow = pHead;

    //pFast==NULL 代表奇数个
    //pFast->_pNext==NULL 偶数个
    while (pFast && pFast->_pNext)
    {
        pFast = pFast->_pNext->_pNext;
        pSlow = pSlow->_pNext;
    }

    return pSlow;
}

// 查找链表的倒数第K个结点 
PNode FindLastKNode(PNode pHead, size_t K)
{
    PNode pFast = pHead;
    PNode pSlow = pHead;

    if (K == 0)
    { 
        printf("不存在倒数第0个节点\n");
        return NULL;
    }

    while (--K && pFast && pFast->_pNext)
    {
        pFast = pFast->_pNext;
    }
    if(K)
    {
        printf("不存在该节点\n");
        return NULL;
    }
    while (pFast && pFast->_pNext)
    {
        pFast = pFast->_pNext;
        pSlow = pSlow->_pNext;
    }
    return pSlow;
}

// 删除单链表的倒数第K个结点 
int DeleteLastKNode(PNode* ppHead, size_t K)
{
    PNode Del = NULL;
    PNode Pre = NULL;
    assert(ppHead);

    Del = FindLastKNode((*ppHead), K);
    if (Del == (*ppHead))
    {
        *ppHead = Del->_pNext;
        free(Del);
        return;
    }
    else
    {
        Pre = (*ppHead);
        while (Pre && Pre->_pNext != Del)
        {
            Pre = Pre->_pNext;
        }
        if (Pre->_pNext == Del)
        {
            Pre->_pNext = Del->_pNext;
            free(Del);
        }
    }
}

// 合并两个已序链表,合并之后依然有序 
PNode MergeList(PNode pHead1, PNode pHead2)
{
    PNode pNewNode = NULL;

    if (!pHead1 && pHead2)
        return pHead2;
    else if (!pHead2 && pHead1)
        return pHead1;
    else if (!pHead1 && !pHead2)
        return NULL;

    while (pHead1 && pHead2)
    {
        if (pHead1->_data <= pHead2->_data)
        {
            SListPushBack(&pNewNode, pHead1->_data);
            pHead1 = pHead1->_pNext;
        }
        else if (pHead1->_data > pHead2->_data)
        {
            SListPushBack(&pNewNode, pHead2->_data);
            pHead2 = pHead2->_pNext;
        }
    }

    while (pHead1)
    {
        SListPushBack(&pNewNode, pHead1->_data);
        pHead1 = pHead1->_pNext;
    }
    while (pHead2)
    {
        SListPushBack(&pNewNode, pHead2->_data);
        pHead2 = pHead2->_pNext;
    }
    return pNewNode;
}

// 判断单链表是否带环 
PNode HasCircle(PNode pHead)
{
    PNode pFast = pHead;
    PNode pSlow = pHead;

    while (pFast && pFast->_pNext)
    {
        pFast = pFast->_pNext->_pNext;
        pSlow = pSlow->_pNext;
        if (pFast == pSlow)
            return pFast;
    }
    return NULL;

}


// 求环的长度 
size_t GetCircleLen(PNode pHead)
{
    size_t length = 1;
    PNode pN = NULL;
    PNode EndNode = NULL;

    if (pN = HasCircle(pHead))
    {
        EndNode = pN;
        while (pN->_pNext != EndNode)
        {
            length++;
            pN = pN->_pNext;
        }
    }
    return length;
}


// 求环的入口点 
PNode GetEnterNode(PNode pHead, PNode pMeetNode)
{
    PNode entry = NULL;

    if (!pHead || !pMeetNode)
    {
        return NULL;
    }

    while (pMeetNode != pHead)
    {
        pMeetNode = pMeetNode->_pNext;
        pHead = pHead->_pNext;
    }
    return pMeetNode;
}

// 判断两个不带环单链表是否相交?若干相交求交点 
int IsCrossWithoutCircle(PNode pHead1, PNode pHead2)
{
    while (pHead1 && pHead1->_pNext)
    {
        pHead1 = pHead1->_pNext;
    }
    while (pHead2 && pHead2->_pNext)
    {
        pHead2 = pHead2->_pNext;
    }
    if (pHead1 = pHead2)
    {
        return 1;
    }
    else return 0;
}
PNode GetCorssNode(PNode pHead1, PNode pHead2)
{
    int size1 = 0;
    int size2 = 0;
    int size3 = 0;
    size1 = Size(pHead1);
    size2 = Size(pHead2);
    size3 = size1 - size2;
    if (!IsCrossWithoutCircle(pHead1, pHead2))
    {
        return NULL;
    }

    if (size3 >= 0)
    {
        while ( size3-- )
        {
            pHead1 = pHead1->_pNext;
        }
        while (pHead1 != pHead2)
        {
            pHead1 = pHead1->_pNext;
            pHead2 = pHead2->_pNext;
        }
    }
    else
    {
        while (size3++)
        {
            pHead2 = pHead2->_pNext;
        }
        while (pHead1 != pHead2)
        {
            pHead1 = pHead1->_pNext;
            pHead2 = pHead2->_pNext;
        }
    }
    return pHead1;
}


///-----------------测试
// 逆序打印单链表 测试
void PrintListFromTail2Head_test()
{

    PNode pHead = NULL;
    SListInit(&pHead);
    printf("-----逆序打印测试-----------------\n");
    printf("原始链表: ");
    SListPushBack(&pHead, 0);
    SListPushBack(&pHead, 1);
    SListPushBack(&pHead, 2);
    SListPushBack(&pHead, 3);
    SListPushBack(&pHead, 4);
    SListPrint(pHead);
    printf("测试结果: ");
    PrintListFromTail2Head(pHead);
    printf("\n");
    printf("\n");
}

// 删除单链表的非尾结点 测试
void DeleteNonEnd_test()
{
    PNode pHead = NULL;
    SListInit(&pHead);
    printf("-----非尾节点删除测试-----------------\n");
    printf("原始链表: ");
    SListPushBack(&pHead, 0);
    SListPushBack(&pHead, 1);
    SListPushBack(&pHead, 2);
    SListPushBack(&pHead, 3);
    SListPushBack(&pHead, 4);
    SListPrint(pHead);

    printf("测试结果: ");
    DeleteNonEnd(Find(pHead, 2)); 
    SListPrint(pHead);
    DeleteNonEnd(Find(pHead, 0));
    SListPrint(pHead);
    DeleteNonEnd(Find(pHead, 1));
    SListPrint(pHead);
    DeleteNonEnd(Find(pHead, 4));
    SListPrint(pHead);
    DeleteNonEnd(Find(pHead, 3));
    SListPrint(pHead);
    printf("\n");
}

// 在无头单链表某节点前插入值为data新节点 测试
void InsertFront_test()
{
    PNode pHead = NULL;
    SListInit(&pHead);
    printf("-----无头单链表插入测试-----------------\n");
    printf("原始链表: ");
    SListPushBack(&pHead, 0);
    SListPushBack(&pHead, 1);
    SListPushBack(&pHead, 2);
    SListPushBack(&pHead, 3);
    SListPushBack(&pHead, 4);
    SListPrint(pHead);
    printf("测试结果: \n");
    InsertFront(Find(pHead, 0), 9);
    SListPrint(pHead);
    InsertFront(Find(pHead, 1), 9);
    SListPrint(pHead);
    InsertFront(Find(pHead, 2), 9);
    SListPrint(pHead);
    InsertFront(Find(pHead, 3), 9);
    SListPrint(pHead);
    InsertFront(Find(pHead, 4), 9);
    SListPrint(pHead);
    printf("\n");
}

// 用单链表模拟实现约瑟夫环 测试
void JosephCircle_test() 
{
    PNode pHead;
    printf("-----模拟实现约瑟夫环测试-----------------\n");
    printf("原始链表: ");
    SListInit(&pHead);
    SListPushBack(&pHead, 0);
    SListPushBack(&pHead, 1);
    SListPushBack(&pHead, 2);
    SListPushBack(&pHead, 3);
    SListPushBack(&pHead, 4);
    SListPushBack(&pHead, 5);
    SListPushBack(&pHead, 6);
    SListPrint(pHead);
    Find(pHead, 6)->_pNext = pHead;
    JosephCircle(&pHead, 4);
    printf("测试结果: ");
    SListPrint(pHead);
    printf("\n");

}

// 单链表的逆置--三个指针 测试
void ReverseList_test()
{
    PNode pHead;
    printf("-----单链表(三个指针)逆置测试-----------------\n");
    printf("原始链表: ");
    SListInit(&pHead);
    SListPushBack(&pHead, 0);
    SListPushBack(&pHead, 1);
    SListPushBack(&pHead, 2);
    SListPushBack(&pHead, 3);
    SListPushBack(&pHead, 4);
    SListPushBack(&pHead, 5);
    SListPushBack(&pHead, 6);
    SListPrint(pHead);

    printf("测试结果: ");
    ReverseList(&pHead);
    SListPrint(pHead);
    printf("\n");

}

// 单链表的逆置--头插法 测试
void ReverseList_p_test()
{
    PNode pHead;
    printf("-----单链表(头插法)逆置测试-----------------\n");
    printf("原始链表: ");
    SListInit(&pHead);
    SListPushBack(&pHead, 0);
    SListPushBack(&pHead, 1);
    SListPushBack(&pHead, 2);
    SListPushBack(&pHead, 3);
    SListPushBack(&pHead, 4);
    SListPushBack(&pHead, 5);
    SListPushBack(&pHead, 6);
    SListPrint(pHead);

    printf("测试结果: ");
    pHead = ReverseList_P(pHead);
    SListPrint(pHead);
    printf("\n");
}


// 使用冒泡排序对单链表进行排序 测试
void BubbleSort_test()
{
    PNode pHead;
    printf("-----冒泡排序测试-----------------\n");
    printf("原始链表: ");
    SListInit(&pHead);
    SListPushBack(&pHead, 5);
    SListPushBack(&pHead, 3);
    SListPushBack(&pHead, 6);
    SListPushBack(&pHead, 2);
    SListPushBack(&pHead, 0);
    SListPushBack(&pHead, 1);
    SListPushBack(&pHead, 4);
    SListPrint(pHead);

    printf("测试结果: ");
    BubbleSort(pHead);
    SListPrint(pHead);
    printf("\n");
}

// 查找单链表的中间结点,要求只能遍历一次链表 测试
void FindMiddleNode_test()
{
    PNode pHead;
    PNode MidNode;
    printf("-----单链表中间结点 测试-----------------\n");
    printf("原始链表: ");
    SListInit(&pHead);
    SListPushBack(&pHead, 0);
    SListPushBack(&pHead, 1);
    SListPushBack(&pHead, 2);
    SListPushBack(&pHead, 3);
    SListPushBack(&pHead, 4);
    SListPushBack(&pHead, 5);
    SListPushBack(&pHead, 6);
    SListPrint(pHead);

    printf("测试结果: ");
    MidNode = FindMiddleNode(pHead);
    printf("MidNode: %d\n", MidNode->_data);
    printf("\n");

}

// 查找链表的倒数第K个结点 测试
void FindLastKNode_test()
{
    PNode pHead = NULL;
    PNode pLastK = NULL;
    printf("-----链表的倒数第K个结点 测试-----------------\n");
    printf("原始链表");
    SListInit(&pHead);
    SListPushBack(&pHead, 7);
    SListPushBack(&pHead, 6);
    SListPushBack(&pHead, 5);
    SListPushBack(&pHead, 4);
    SListPushBack(&pHead, 3);
    SListPushBack(&pHead, 2);
    SListPushBack(&pHead, 1);
    SListPrint(pHead);

    printf("测试结果:   ");
    pLastK = FindLastKNode(pHead, 1);
    printf("倒数第1个节点:%d  ",pLastK->_data);
    pLastK = FindLastKNode(pHead, 2);
    printf("倒数第2个节点:%d  ", pLastK->_data);
    pLastK = FindLastKNode(pHead, 3);
    printf("倒数第3个节点:%d  ", pLastK->_data);
    pLastK = FindLastKNode(pHead, 5);
    printf("倒数第5个节点:%d  ", pLastK->_data);
    pLastK = FindLastKNode(pHead, 7);
    printf("倒数第7个节点:%d\n", pLastK->_data);
    printf("\n");
}

// 删除单链表的倒数第K个结点 测试
void DeleteLastKNode_test()
{
    PNode pHead = NULL;
    printf("-----删除链表的倒数第K个结点 测试-----------------\n");
    printf("原始链表: ");
    SListInit(&pHead);
    SListPushBack(&pHead, 7);
    SListPushBack(&pHead, 6);
    SListPushBack(&pHead, 5);
    SListPushBack(&pHead, 4);
    SListPushBack(&pHead, 3);
    SListPushBack(&pHead, 2);
    SListPushBack(&pHead, 1);
    SListPrint(pHead);

    printf("测试结果: ");
    DeleteLastKNode(&pHead, 7);
    SListPrint(pHead);

    printf("\n");
}

// 合并两个已序链表,合并之后依然有序 测试
void MergeList_test()
{
    PNode pHead1 = NULL;
    PNode pHead2 = NULL;
    PNode pNewNode = NULL;
    printf("-----合并两个已序链表 测试-----------------\n");
    printf("原始链表1: ");
    SListInit(&pHead1);
    SListInit(&pHead2);
    SListPushBack(&pHead1, 2);
    SListPushBack(&pHead1, 4);
    SListPushBack(&pHead1, 6);
    SListPushBack(&pHead1, 7);
    SListPushBack(&pHead1, 8);
    SListPushBack(&pHead1, 10);
    SListPushBack(&pHead1, 11);
    SListPrint(pHead1);
    printf("原始链表2: ");
    SListPushBack(&pHead2, 1);
    SListPushBack(&pHead2, 5);
    SListPushBack(&pHead2, 9);
    SListPushBack(&pHead2, 10);
    SListPrint(pHead2);

    printf("测试结果:  ");
    pNewNode = MergeList(pHead2, pHead1);
    SListPrint(pNewNode);
    printf("\n");
}

// 判断单链表是否带环 测试
void HasCircle_test()
{
    PNode pHead;

    printf("-----判断单链表是否带环 测试-----------------\n");
    SListInit(&pHead);
    SListPushBack(&pHead, 0);
    SListPushBack(&pHead, 1);
    SListPushBack(&pHead, 2);
    SListPushBack(&pHead, 3);
    SListPushBack(&pHead, 4);
    SListPushBack(&pHead, 5);
    SListPushBack(&pHead, 6);
    Find(pHead, 6)->_pNext = Find(pHead, 4);

    if (HasCircle(pHead))
        printf("测试结果: 带环\n");
    else 
        printf("测试结果: 不带环\n");
    printf("\n");
}

// 求环的长度 测试
void GetCircleLen_test()
{
    PNode pHead;
    size_t length;

    printf("-----求环的长度 测试-----------------\n");
    SListInit(&pHead);
    SListPushBack(&pHead, 0);
    SListPushBack(&pHead, 1);
    SListPushBack(&pHead, 2);
    SListPushBack(&pHead, 3);
    SListPushBack(&pHead, 4);
    SListPushBack(&pHead, 5);
    SListPushBack(&pHead, 6);
    Find(pHead, 6)->_pNext = Find(pHead, 3);

    length = GetCircleLen(pHead);
    printf("测试结果:Circle Length: %d\n", length);
    printf("\n");

}


// 求环的入口点 测试
void GetEnterNode_test()
{
    PNode pHead;
    PNode Entry;

    printf("-----求环的入口点 测试-----------------\n");
    SListInit(&pHead);
    SListPushBack(&pHead, 0);
    SListPushBack(&pHead, 1);
    SListPushBack(&pHead, 2);
    SListPushBack(&pHead, 3);
    SListPushBack(&pHead, 4);
    SListPushBack(&pHead, 5);
    SListPushBack(&pHead, 6);
    Find(pHead, 6)->_pNext = Find(pHead, 3);

    Entry = GetEnterNode(pHead, HasCircle(pHead));
    printf("测试结果: ");
    printf("%d---> \n", Entry->_data);
    printf("\n");
}

// 判断两个不带环单链表是否相交?若干相交求交点 测试
void IsCrossWithoutCircle_test()
{
    PNode pHead1 = NULL;
    PNode pHead2 = NULL;
    PNode pCrossNode = NULL;
    printf("-----判断两个不带环单链表是否相交 测试-----------------\n");
    printf("原始链表1: ");
    SListInit(&pHead1);
    SListInit(&pHead2);
    SListPushBack(&pHead1, 11);
    SListPushBack(&pHead1, 12);
    SListPushBack(&pHead1, 13);
    SListPushBack(&pHead1, 14);
    SListPushBack(&pHead1, 5);
    SListPushBack(&pHead1, 6);
    SListPushBack(&pHead1, 7);
    SListPrint(pHead1);
    printf("原始链表2: ");
    SListPushBack(&pHead2, 21);
    SListPushBack(&pHead2, 22);
    SListPushBack(&pHead2, 23);
    SListPushBack(&pHead2, 24);
    //Find(pHead2, 24)->_pNext = Find(pHead1, 5);
    //Find(pHead2, 24)->_pNext = Find(pHead1, 11);
    pHead2 = pHead1;
    SListPrint(pHead2);

    printf("测试结果: ");
    if (IsCrossWithoutCircle(pHead1, pHead2))
    {
        pCrossNode = GetCorssNode(pHead1, pHead2);
        printf("有焦点\t 焦点: %d\n", pCrossNode->_data);
    }
    else 
    {
        printf("没有交点\n");
    }
    printf("\n");
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值