博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
快速找到未知长度的单链表的中间结点
阅读量:4593 次
发布时间:2019-06-09

本文共 1596 字,大约阅读时间需要 5 分钟。

问题描述:快速找到未知长度的单链表的中间结点

普通方法:首先遍历一遍单链表,以确定单链表的长度L,然后再从头结点出发,循环L/2次,找到单链表的中间结点。

高效算法(快慢指针):设置两个指针,*search,*mid都指向单链表的头结点。其中*search指针的移动速度是*mid指针移动速度的2倍。当*search移动到链表末尾时,*mid刚好在中间结点。(标尺的思想)

//快速得到单链表的中间结点Status GetMidNode(LinkList &L,int &e){    LinkList search,mid;    search = L;    mid = L;//初始时候,search和mid都指向链表的头结点    while(search->next != NULL){        if(search->next->next != NULL){            search = search->next->next;            mid = mid->next;        }        else            search = search->next;    }    e = mid->data;    return OK; }

 实例:

#include
#include
#include
#include
#include
#define OVERFLOW -2using namespace std;typedef struct Node{ int data; struct Node *next;}Node,*LinkList;void ListInit(LinkList &L){ L = (LinkList)malloc(sizeof(Node)); if(!L) exit(OVERFLOW); L->next = NULL;}void ListCreate(LinkList &L, int n){
//尾插法 LinkList r,p; r = L; srand(time(0));//初始化随机数种子 for(int i = 0; i < n; i++){ p = (LinkList)malloc(sizeof(Node)); p->data = rand()%100+1;//产生1-100的随机数 r->next = p; r = p; } r->next = NULL; }void PrintList(LinkList &L){ cout<<"生成的单链表:"<
<
next; while(p){ cout<
data<<" "; p = p->next; } cout<
next != NULL){ if(search->next->next != NULL){ search = search->next->next; mid = mid->next; } else search->next; } e = mid->data;}int main(){ int e; LinkList L; ListInit(L); ListCreate(L,10); PrintList(L); cout<

转载于:https://www.cnblogs.com/geziyu/p/9897991.html

你可能感兴趣的文章
unity中遍历动画得到动画名字和动画数量
查看>>
调整WebLogic的时间
查看>>
Linux学习笔记总结--配置iptables防火墙
查看>>
win10 安装mysql
查看>>
SQL文 Update From 写法
查看>>
pyc文件的本质
查看>>
洛谷 - P2602 - 数字计数 - 数位dp
查看>>
android 环境配置 与 运行错误
查看>>
打电话的代码
查看>>
C++ STL stack(栈)
查看>>
实验3观后感
查看>>
用js采集网页数据并插入数据库最快的方法
查看>>
final关键字
查看>>
作业七
查看>>
【HNOI2006】【Luogu2320】鬼谷子的钱袋(进制,玄学)
查看>>
爬虫大作业
查看>>
spring boot之actuator简介
查看>>
以太坊(一)
查看>>
禁用php函数
查看>>
11.5随笔
查看>>