常见的链表面试题大汇总:

这篇博客汇总了20道常见的链表面试题,包括创建链表节点、遍历、倒序打印、添加和删除节点、求链表长度、找倒数第K个节点、反转链表、判断环以及链表排序等操作。提供了相应的源代码下载链接。
摘要由CSDN通过智能技术生成

常见的链表面试题大汇总:
源代码下载链接
1,创建一个链表结点
2,遍历链表中的所有结点
3,倒序打印链表
4,往链表末尾添加结点
5,往链表前端添加结点,

6,获取链表的节点数目
7,销毁链表
8,求链表中倒数第K个节点
9,反转链表
10,查找链表中间节点

11,判断链表是否有环
12,判断链表是否有环,并返回环上的节点数目
13,判断链表是否有环,并返回环上的入口节点
14,两个链表中的第一个公共节点
15,合并两个有序链表,

16,用O(1)的时间复杂度删除单链表中的某个节点
17,链表的排序–采用选择排序算法实现 复杂度n^2
18,链表的排序–采用归并排序算法实现 复杂度log(n)
19,链表中结点去重
20,给定链表中间某个节点,将待插入节点插入给定节点之前

#include <vector>
#include <stdlib.h>
#include <algorithm>
#include <vector>
#include <iostream>

using namespace  std;

//链表结构 C语言结构
typedef struct ListNode
{
    int m_nValue;
    struct ListNode* m_pNext;
}ListNode;

//链表结构 C++语言结构
struct ListNodeCpp
{
    int m_nValue;
    ListNodeCpp * m_pNext;

    ListNodeCpp():m_nValue(0),m_pNext(NULL){}
    ListNodeCpp(int value):m_nValue(value),m_pNext(NULL){}
};

/*
创建一个链表结点
*/
ListNode* CreateListNode(int value)
{
    ListNode *pNode = new ListNode;
    pNode->m_nValue = value;
    pNode->m_pNext = NULL;

    return pNode;

}

/*
遍历链表中的所有结点
*/
void PrintList(ListNode* pHead)
{
    ListNode *pNode = pHead;

    while(pNode != NULL)
    {
        cout<<pNode->m_nValue<<" ";
        pNode = pNode->m_pNext;
    }
    cout<<endl;
}

/*
倒序打印链表
*/

void PrintListReverse(ListNode* pHead)
{
    if (pHead == NULL)
    {
        return ;
    }
    PrintListReverse(pHead->m_pNext);

    cout<<pHead->m_nValue<<ends;
}


/*
往链表末尾添加结点

注意这里pHead是一个指向指针的指针,在主函数中一般传递的是引用。
因为如果要为链表添加结点,那么就会修改链表结构,所以必须传递引用才能够保存修改后的结构。
*/
void AddToTail(ListNode* & pHead,int value)
{
    ListNode* pNew = new ListNode();//新插入的结点
    pNew->m_nValue = value;
    pNew->m_pNext = NULL;

    if(pHead == NULL)//空链表
    {
        pHead = pNew;
    }
    else
    {
        ListNode* pNode = pHead;

        while(pNode->m_pNext!=NULL)
            pNode=pNode->m_pNext;

        pNode->m_pNext=pNew;
    }

}

/*
往链表前端添加结点

*/

void AddToHead(ListNode* & pHead,int value)
{
    ListNode *pNew = new ListNode;
    pNew->m_nValue = value;
    pNew->m_pNext = pHead;

    pHead = pNew;
}


/*
获取链表的节点数目
*/
int GetListLength(ListNode *pHead)
{
    int len =0;
    ListNode *pNode = pHead;

    while(pNode != NULL)
    {
        len ++;
        pNode = pNode->m_pNext;
    }

    return len;
}

/*
销毁链表
*/
void ReleaseList(ListNode *&pHead)
{
    ListNode *pNode = pHead;
    ListNode *pNext;

    while(pNode != NULL)
    {
        pNext = pNode->m_pNext;
        delete pNode;

        pNode = pNext;
    }

    pHead = NULL;
}

/*
求链表中倒数第K个节点
设置快慢指针,快指针超前慢指针k-1个节点,然后快慢指针再同时遍历链表,
当快指针遍历到链表结尾时,慢指针是倒数第k个节点。
*/
ListNode * FindKthToTail(ListNode *pHead,int k)
{
    if (pHead == NULL || k <=  0)
    {
        return NULL;
    }

    ListNode *p1,*p2;
    p1 = pHead;
    p2 = pHead;

    for (int i =0 ; i < k - 1; i ++)
    {
        if (p1 == NULL)
        {
            return NULL;
        }
        p1 = p1->m_pNext;
    }

    while (p1->m_pNext != NULL)
    {
        p1 = p1->m_pNext;
        p2 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值