题目:输入一个单链表,打印出链表的中间元素,注意时间效率。
算法思想:用快慢指针,设置两个指针fast和slow,两个指针同时开始从头遍历,fast指针每次的步长为2,slow的步长为1,这样,当fast指针遍历到链表末端,slow指针刚好指向链表的中间位置。
代码:
typedef struct node
{
int value;
struct node* next;
}node_t;
node_t* getTheMiddleNode(node_t* head)
{
if(head == NULL)
return NULL;
node_t* fast_ptr = head;
node_t* slow_ptr = head;
while((slow_ptr != NULL) && (fast_ptr != NULL) && (fast_ptr->next != NULL))
{
slow_ptr = slow_ptr->next;
fast_ptr = fast_ptr->next->next;
}
return slow_ptr;
}