面试中常会被问到这个问题:查找链表的中间节点
对于这个问题,我们首先能够想到的就是先遍历一遍整个的链表,然后计算出链表的长度,进行第二遍遍历的时候根据链表长度的一半就能查找到链表的中间节点。这种方法可能比较简单但是时间复杂度为O(2n)。以下我会提供另一种简单方法
其实我们可以定义两个指针,一个快指针fastp,一个慢指针slowp。遍历链表时,慢指针每走一步,快指针则走两步,当快指针走到空时,慢指针指向的结点就是中间节点。
这种方法的时间复杂度为O(n),面试时你若是讲述这种方法会增加你的分数。
代码如下:
结构体定义:
typedef struct node{
int data;
struct node *next;
}ElemSN;
这里就不在赘述链表的创建了,默认已经创建好链表,head为传过来的头指针。
//查找链表的中间节点
ElemSN * FindMiddleNode(ElemSN *head){
ElemSN *fastp,*slowp;
fastp=slowp=head;
for(;fastp&&fastp->next&&fastp->next->next;){
slowp=slowp->next; //慢指针走一步,快指针走两步
fastp=fastp->next->next;
}
return slowp;
}