链表使用快慢指针求中间值
来源:互联网 发布:淘宝c店女装排行榜 编辑:程序博客网 时间:2024/05/22 00:11
思想
声明两个指针r,h,开始位置都为头节点,然后向后移动,r的移动速度是h 的两倍(移动速度是指跨越的节点个数比如r = r->next->next跨越了两个节点,h = h->next,跨越了一个节点)当r到达链表尾部,那么h就刚好在链表的中间。
代码
#include <stdio.h>#include <stdlib.h>typedef struct Node{ int data; struct Node *next;}*Linklist,Node;//创建头节点,创建链表Linklist CreateHead(){ Linklist head; head = (Linklist)malloc(sizeof(Node)); head->next = NULL; return head;}//插入随机数据,这里插入奇数个,方便理解中间值void InsertData(Linklist *L){ Linklist r,p; int i; r = (*L); srand(time(NULL)); for(i = 0; i < 10; i++){ p = (Linklist)malloc(sizeof(Node)); p->data = rand()%100+1; p->next = NULL; r->next = p; r = p; }}void Disp(Linklist *L){ Linklist h; int i = 1; h = (*L); while(h->next != NULL){ printf("%d %d \n",i++,h->next->data); h = h->next; } printf("\n");}//通过快慢指针的方法求出中间值void KuaiManZhiZheng(Linklist *L){ Linklist r,h;//声明两个一快一慢的指针 r = (*L);//初始位置都指向头节点 h = r; while(1){ //这里并不知道总的节点个数为多少个,奇偶情况通过数学规律得出 //链表节点数为偶数时,快指针移动到最后时下个元素为空 if(r->next == NULL){ /*在这里我判定为他们两个都为中间值,其实也可以说节点为偶数个数 时并没有中间值*/ printf("中间值为%d和%d\n",h->data,h->next->data); break; } //链表节点为奇数时,快指针移动到最后时下个的下个元素为空 if(r->next->next == NULL){ printf("中间值为%d\n",h->data); break; } r = r->next->next; h = h->next; }}int main(){ Linklist head; head = CreateHead(); InsertData(&head); Disp(&head); KuaiManZhiZheng(&head); return 0;}
阅读全文
0 0
- 链表使用快慢指针求中间值
- 【面试题】-求未知长度的链表的中间节点(快慢指针)
- 数据结构之快慢指针查找链表中间结点
- 数据结构——快慢指针法查找链表中间值
- 快慢链表和快慢指针
- 链表面试题之快慢指针问题(一) 查找链表中间节点
- 【数据结构】单链表—求链表中间节点(只遍历一次链表)— 快慢指针
- 线性表(插入/清除数据/快慢指针查找中间数据)
- 链表快慢指针应用
- 快慢指针 find linkedlist 中间元素
- 单链表的中间节点-快慢指针
- 快慢指针在链表的应用
- 快慢指针在链表的应用
- 快慢指针,链表的排序
- 链表追赶之快慢指针
- 链表之快慢指针续
- 快慢指针和链表原地反转
- 快慢指针在链表中的应用
- centos 6.5安装git
- 数塔问题
- selenium处理select标签的下拉框
- request 和 response 两兄弟
- vue-cli架构
- 链表使用快慢指针求中间值
- -fobjc-arc 和 -fno-objc-arc 的使用
- 【面试题】剑指offer28--字符串的排列
- Java经典五十道题41-50
- HDU 3652 数位DP 解题报告
- STL的使用
- 向量旋转算法《编程珠玑》第二章笔记
- Hadoop-CDH5.11.0版本安装-双节点完整版
- 软件著作权的审查