查找链表的中间结点
查找链表的中间结点
题目:设计一算法查找链表的中间结点。要求该算法的时间复杂度为O(n),空间复杂度为O(1)。
当看到这个时候想了半天没想出来,时间复杂度是没问题的,但是空间复杂度要达到O(1)还是有一点不好办,然后百度了一下,发现有快指针和慢指针的写法,于是我就进去瞧了瞧,突然惊叹一声“妙啊!”
使用两个指针同时遍历链表,快指针遍历的速度是慢指针的两倍,那么当快指针遍历完整个链表的时候,慢指针恰好位于整个链表的中间部分,那么此刻输出
slow->data
即为链表中间的元素
代码:
// Created by CAD on 2019/10/14.
#include <bits/stdc++.h>
using namespace std;
struct Node{
int data;
Node* next;
Node(){next=NULL;}
};
typedef Node* LinkList;
int get_mid(LinkList L)
{
LinkList slow=L,fast=L;
for(;fast&&fast->next;)
slow=slow->next,fast=fast->next->next;
return slow->data;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
LinkList list1=new Node;
LinkList p=list1,node;
p=list1;
for(int i=1;i<=5;++i)
node=new Node,node->data=i,p->next=node,p=node;
cout<<get_mid(list1);
return 0;
}