常见的链表面试题大汇总:
源代码下载链接
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