链表中的快慢指针

题目:带有头结点的单链表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;
}

 运行结果:

 

猜你喜欢

转载自blog.csdn.net/smallrain6/article/details/106186987