您的位置:首页 > 职场人生

2012腾讯暑期实习面试题----寻找链表中间结点

2012-04-22 13:21 316 查看
最简单的想法:先遍历链表统计结点个数,然后结点数/2就是中间结点的位置,再遍历就可以指向中间结点

如果只能遍历一次呢?

优化算法:设定两个指向第一个结点的指针,一个(p)一次走一个,一个(q)一次走两个。当走的快的到达链表尾部(q->next==NULL ||q->next->next==NULL)时,慢的就指向中间结点。当然要特别考虑结点个数为0 1 2的情况。

下面是具体实现:(本程序初始化的链表没有头结点)

#include<iostream>

using namespace std;

struct node{

int data;

node* next;

node(int _data):data(_data),next(NULL){}

};

//初始化链表

node* init(int num)

{

if (num==0)

return NULL;

node* head = new node(1);

node* temp = head;

if(num>1)

{

for(int i=2; i<=num; i++)

{

temp->next = new node(i);

temp = temp->next;

}

}

return head;

}

//输出链表

void print(node* head)

{

while(head)

{

cout<<head->data<<" ";

head = head->next;

}

cout<<endl;

}

node* findMid(node* head)

{

if(NULL==head)

return NULL;

if(head->next==NULL || head->next->next==NULL)

return head;

node* mid = head;

while(head->next!=NULL && head->next->next!=NULL)

{

head = head->next->next;

mid = mid->next;

}

return mid;

}

int main()

{

int num = 102;//链表结点个数

node* head = init(num);

print(head);

node* mid = findMid(head);

if(mid)

{

cout<<"mid.data = "<<mid->data<<endl;

}

}

写这个程序的时候纠结于是否考虑头结点(上面的程序实现的没有头结点的链表)。下面是我对头结点的认识:

关于头结点head,目的是为了方便链表的操作,才外设的一个有指针无数据的结点。

1、头结点不作为链表的长度;

2、循环链表中尾结点的next指向头结点;

3、链表的第一个元素为head->next指向值;

4、链表为空即:head->next == null;

若是这么声明:L为单链表的头指针,它指向表中第一个结点。这里就没有头结点。这里若L=NULL,表示线性表为空,长度为0。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: