原文地址:http://leihuang.org/2014/05/19/List-Interviews/
单链表的一些常见面试题汇总
- 单链表反转/逆序
- 求单链表倒数第N个数
- 找到单链表的中间结点
- 如何判断链表是否有环的存在
- 单链表建环,无环链表变有环
- 如何知道环的长度?
- 如何找出环的连接点在哪里?
- 删除单链表中的重复元素
下面我先简单叙述一下每道题的思路,然后把实现的程序一起贴出来,不会讲得太细,我觉得只要有了思路之后,接下来的难点就是语言上的一些细节问题了,这个不自己去实现,听别人讲是体会不到的。 要实现下面的代码你首先要会实现单链表, see:线性表
1.单链表反转
我是利用三个指针来实现的,三个连续指针依次向前移动,每次反转前两个指针指向数之间的指针。
代码如下:
/* 链表反转 */
void ReverseList(List *L)
{
if(!L->Next->Next)
;
else{
List *pTemp = L->Next->Next->Next ;
List *pMid = L->Next->Next ;
List *pCurrent = L->Next ;
L->Next->Next = NULL ;
while(pTemp){
pMid->Next = pCurrent ;
pCurrent = pMid ;
pMid = pTemp ;
pTemp = pTemp->Next ;
}
pMid->Next = pCurrent ;
L->Next = pMid ;
}
}
2.求单链表倒数第N个数
利用两指针遍历表,保持他们的距离为n,当后面的指针为NULL时,输出前面指针所指向的数,即倒数第N个数。
函数代码:
/* 求单链表倒数第N个数 */
int NIndex(List L,int n)
{
List *fir,*sec ;
fir = L.Next ;
sec = L.Next ;
int i ;
for(i=0;sec;++i){
if(i>=n){
fir = fir->Next ;
sec = sec->Next ;
}else
sec = sec->Next ;
}
return fir->elem ;
}