查找链表的中间结点
题目:设计一算法查找链表的中间结点。要求该算法的时间复杂度为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; }