如何快速找到未知长度单链表的中间节点
2021-09-12 本文已影响0人
编程的猫
普通方法:
首先遍历一遍单链表,确定单链表长度L,然后再次从头结点出发,循环L/2次找到单链表的中间结点。
算法复杂度:O(L+L/2)=O(3L/2)
实现代码:
/**
* 获取单链表的中间节点(普通方法)
*/
status getMidNode(LinkList L){
int j = 0,len = 0;
LinkList p = L;
//循环单链表,确定单链表长度L
while(p){
if(p->next == NULL){
break;
}
p = p->next;
len++;
}
//printf("len=%d",len);
//循环L/2次找到单链表的中间结点
p = L;
while(p){
p = p->next;
j++;
if(j > (int)len/2){
break;
}
}
printf("j=%d, p->data=%d\n",j,p->data);
return OK;
}
优化方法:(利用快慢指针)
设置两个指针p、mid都指向单链表的头结点。其中p的移动速度是mid的2倍,当p指向末尾结点时,mid刚好就在中间了,这也是标尺的思想。
算法复杂度:O(L/2)
实现代码:
/**
* 获取单链表的中间节点(利用快慢指针)
*/
status getMidNode(LinkList L){
LinkList p = L, mid = L;
while(p){
if(p->next == NULL){
break;
}
p = p->next->next;
mid = mid->next;
}
printf("mid->data=%d\n",mid->data);
return OK;
}