题目:带有头结点的单链表L,设计一个尽可能高效的算法,求L中的中间节点
思路:快慢指针
定义两个指针,其中快指针走两步,慢指针走一步,当快指针指向结尾的时候,慢指针刚好指向中间结点
(大青蛙表示快指针,小青蛙表示慢指针)
代码实现如下:
#include<iostream>
#include<string>
using namespace std;
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//使用头插法创建单链表,注意创建链表的时候需要&符号
void CreatList_R(LinkList &L)
{
int n;
LinkList s,r;
L = new LNode;
L->next = NULL;
r = L;
cout << "请输入元素的个数:" << endl;
cin >> n;
while (n--)
{
s = new LNode;
cin >> s->data;
r -> next = s;
r = s;
}
}
LinkList FindMid(LinkList L)
{
//定义快指针p,慢指针q
LinkList p,q;
p = L;
q = L;
//如果p->next = NULL,不存在p->next->next
while (p != NULL && p->next != NULL)
{
p = p->next->next;
q = q->next;
}
//返回中间结点
return q;
}
//单链表的输出
void ListPrint_L(LinkList L)
{
LinkList p;
p = L->next;
while(p)
{
cout << p->data << endl;
p = p->next;
}
}
int main()
{
LinkList L,mid;
CreatList_R(L);
mid = FindMid(L);
cout << "中间元素为:" << mid->data << endl;
return 0;
}
运行结果: