快速找到未知长度单链表的中间节点
使用快慢指针,当一个指针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; }