百度面试题:一个单链表,长度未知,如何快速的找出位于中间的那个元素
2015-03-31 20:47
609 查看
问题:
一个单链表,长度未知,如何快速的找出位于中间的那个元素?设置两个指针,p1,p2, 开始p1,p2均位于链接的头部。
p1 每次步进两步,
p2 每次步进一步
当p1到达链表的末尾时,p2所在的位置就是链表的中间元素
时间复杂度为O(n)
详细情况请见代码:
[cpp] view
plaincopy
#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();
}
相关文章推荐
- 百度面试题:一个单链表,长度未知,如何快速的找出位于中间的那个元素
- 百度面试题:一个单链表,长度未知,如何快速的找出位于中间的那个元素
- 一个有头尾的单链表,长度未知,如何快速的找出位于中间的那个元素?
- 算法面试题:快速找到未知长度单链表的中间节点
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环)
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环)
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环) (转)
- 给出一个单链表如何只遍历一次就找出中间节点(我们并不知道单链表的长度N)
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环)
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环)
- 腾讯面试题:快速找到未知长度单链表的中间节点
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环) (转)
- 四道有趣的单链表面试题(单链表反序、找出链表的中间元素、链表排序、判断一个单链表是否有环
- 学习篇--快速查询未知长度单链表的中间元素
- 如何快速找到未知长度单链表的中间节点
- 快速找到未知长度单链表的中间结点
- 一个单链表,不知道长度,写一个函数快速找到中间节点的位置
- 快速找到未知长度单链表的中间节点
- 快速找到未知长度单链表的中间节点
- 快速找到未知长度单链表的中间节点。(腾讯)