快速找到未知长度单链表的中间节点

使用快慢指针,当一个指针i指向下一个节点时,另一个指针j指向下一个节点的下一个节点。

即j的移动速度是i的两倍,当j指向最后一个节点时,i指向链表的中间节点

代码如下:

#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;

typedef struct node
{
    ElemType data;
    struct node *next;
}LinkList;

LinkList *CreateListTail()
{
    LinkList *p,*r,*head;
    int i;

    head = (LinkList *)malloc(sizeof(LinkList)); /* L为整个线性表 */
    r=head;                                /* r为指向尾部的结点 */

    for (i=0; i < 20; i++)
    {
        p = (LinkList *)malloc(sizeof(LinkList)); /*  生成新结点 */
        p->data = rand()%100+1;           /*  随机生成100以内的数字 */
        r->next=p;                        /* 将表尾终端结点的指针指向新结点 */
        r = p;                            /* 将当前的新结点定义为表尾终端结点 */
    }

    r->next = NULL;                       /* 表示当前链表结束 */
    
    return head;
}

void print(LinkList *L)
{
    LinkList *p1;
    p1=L->next;

    int n=20;
    while(n--)
    {
        printf("%d\t",p1->data);
        p1=p1->next;
    }
    
    printf("\n");
 
}

int GetMidNode(LinkList *L,ElemType *e)
{
    LinkList *search,*mid;
    search=mid=L;

    while(search->next!=NULL)
    {
        if(search->next->next!=NULL)
        {
            search=search->next->next;
            mid=mid->next;
        }
        else
            search=search->next;
    }

    *e=mid->data;

    return *e;
}

int main()
{
    LinkList *head;
    int t,e;

    printf("1、创建链表\n2、查看链表\n3、查找中间节点数据\n");
    printf("请输入你的选项:\n");

    while(t)
    {
        scanf("%d",&t);
        switch(t)
        {
        case 1:
            head=CreateListTail();
            print(head);
            break;
        case 2:
            print(head);
            break;
        case 3:
            e=GetMidNode(head,&e);
            printf("%d\n",e);
            break;
        default:
            exit (0);
        }
    }
    return 0;
}
View Code

 

posted on 2015-09-17 20:58  52Cassie  阅读(124)  评论(0编辑  收藏  举报