问题:
一个单链表,长度未知,如何快速的找出位于中间的那个元素?
设置两个指针,p1,p2, 开始p1,p2均位于链接的头部。
p1 每次步进两步,
p2 每次步进一步
当p1到达链表的末尾时,p2所在的位置就是链表的中间元素
时间复杂度为O(n)
详细情况请见代码:
#include <iostream> using namespace std; struct node{ node *next; int data; }; //用一个类封装链表的操作 class linknode{ public: linknode(){ head = new node; head->next = NULL; } ~linknode(){ delete head; } //销毁所有资源 void Clear(){ node *p,*q; p = head; while(p){ q = p->next; delete p; p = q; } //注意这里 head->next = NULL; cout << "OK,destroyed all elements" << endl; } //尾插法 void Create(int n){ node *p,*q; int data; p = head; while(n--){ q = new node; cout << "input data:"; cin >> data; q->data = data; q->next = NULL; p->next = q; p = q; } } void Output(){ node *p; //注意,不要写成p = head;因为头结点没有保存数据 p = head->next; while(p){ cout << p->data << " "; p = p->next; } cout << endl; } //查找中间的元素 node* findMid(){ node *p1,*p2; p1 = head; p2 = head; while(p1 != NULL && p2 != NULL){ p1 = p1->next->next; p2 = p2->next; } return p2; } private: node *head; }; int main(){ linknode lk; node *tmp; lk.Create(5); lk.Output(); tmp = lk.findMid(); cout << tmp->data << endl; lk.Clear(); }