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

快速找到未知长度单链表的中间节点(百度) 有道算法面试题:快速找到未知长度单链表的中间节点。 【1】你可以普通方法也可用比较好的方法,去解决这个问题。由于单链表不知道长 度,必须遍历完整个单链表才知道单恋表的长度,然后根据一般的长度去找中间结 点,这是普通方法。 【2】当然题目问的是快速找到,当然要用快速的方法啦。这里我们快慢指针的方法 来解决这个问题,快指针每次走2个结点,慢指针每次走1个结点,当快指针走完链表 ,慢指针刚好走到中间,这... 阅读详情

http://blog.fishc.com/1936.html

 题目:快速找到未知长度单链表的中间节点。
既然是面试题就一定有普通方法和高级方法,而高级方法无疑会让面试官大大加分!
普通的方法很简单,首先遍历一遍单链表以确定单链表的长度L。然后再次从头节点出发循环L/2次找到单链表的中间节点。
算法复杂度为:O(L+L/2)=O(3L/2)。
 
能否再优化一下这个时间复杂度呢?
有一个很巧妙的方法:利用快慢指针!
 
利用快慢指针原理:设置两个指针*search、*mid都指向单链表的头节点。其中* search的移动速度是*mid的2倍。当*search指向末尾节点的时候,mid正好就在中间了。这也是标尺的思想。
我们来看下代码实现:GetMidNode.c  

Status GetMidNode(LinkList L, ElemType *e){

   LinkList search, mid;

   mid = search = L;

   while (search->next != NULL)

    {

       //search移动的速度是 mid 的2倍

       if (search->next->next != NULL)

       {

           search = search->next->next;

           mid = mid->next;

           //printf("search %d\n", search->data);

           //printf("mid %d\n", mid->data);

       }

       else

       {

           search = search->next;

       }

    }

   *e = mid->data;

   return OK;

}

//另一种寻找中间节点

 iNode * GetMiddleNode ( iNode *head )  


 {  
     iNode *p1 = head;  
     iNode *p2 = p1;  


     while( p2 )  
     {  
         p2 = p2->next;  


         if(p2)  
         {  
             p2 = p2->next;  
             p1=p1->next;  
         }  
     }  
     return p1;  
 }

 

完整可执行代码:

#include "stdio.h"

#define OK 1

#define ERROR 0

#define TRUE 1

#define FALSE 0

typedef int Status;/* Status是函数的类型,其值是函数结果状态代码,如OK等 */

typedef int ElemType;/* ElemType类型根据实际情况而定,这里假设为int */

typedef struct Node

{

   ElemType data;

   struct Node *next;

}Node;

typedef struct Node *LinkList; /* 定义LinkList */

Status visit(ElemType c)

{

   printf("%d ",c);

   return OK;

}

/* 初始化顺序线性表 */

Status InitList(LinkList *L)

{

   *L=(LinkList)malloc(sizeof(Node)); /* 产生头结点,并使L指向此头结点 */

   if(!(*L)) /* 存储分配失败 */

           return ERROR;

   (*L)->next=NULL; /* 指针域为空 */

   return OK;

}

/* 初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数 */

int ListLength(LinkList L)

{

   int i=0;

   LinkList p=L->next; /* p指向第一个结点 */

   while(p)

    {

       i++;

       p=p->next;

    }

   return i;

}

/* 初始条件:顺序线性表L已存在 */

/* 操作结果:依次对L的每个数据元素输出 */

Status ListTraverse(LinkList L)

{

   LinkList p=L->next;

   while(p)

    {

       visit(p->data);

       p=p->next;

    }

   printf("\n");

   return OK;

}

/*  随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法) */

void CreateListTail(LinkList *L, int n)

{

   LinkList p,r;

   int i;

   srand(time(0));                     /* 初始化随机数种子 */

   *L = (LinkList)malloc(sizeof(Node)); /* L为整个线性表 */

   r=*L;                               /* r为指向尾部的结点 */

   for (i=0; i < n; i++)

    {

       p = (Node *)malloc(sizeof(Node)); /* 生成新结点 */

       p->data = rand()%100+1;          /*  随机生成100以内的数字 */

       r->next=p;                        /* 将表尾终端结点的指针指向新结点 */

       r = p;                           /* 将当前的新结点定义为表尾终端结点 */

    }

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

   // 创建有环链表

   //r->next = p;

}

 

Status GetMidNode(LinkList L, ElemType *e){

   LinkList search, mid;

   mid = search = L;

   while (search->next != NULL) {

       //search移动的速度是 mid 的2倍

       if (search->next->next != NULL) {

           search = search->next->next;

           mid = mid->next;

           //printf("search %d\n", search->data);

           //printf("mid %d\n", mid->data);

       }

       else

       {

           search = search->next;

       }

    }

   *e = mid->data;

   return OK;

}

int main()

{

   LinkList L;

   Status i;

   char opp;

   ElemType e;

   int find;

   int tmp;

   i=InitList(&L);

   printf("初始化L后:ListLength(L)=%d\n",ListLength(L));

   printf("\n1.查看链表 \n2.创建链表(尾插法) \n3.链表长度 \n4.中间结点值 \n0.退出 \n请选择你的操作:\n");

   while(opp != '0'){

       scanf("%c",&opp);

       switch(opp){

           case '1':

                ListTraverse(L);

                printf("\n");

                break;

           case '2':

                CreateListTail(&L,20);

                printf("整体创建L的元素(尾插法):\n");

                ListTraverse(L);

                printf("\n");

                break;

           case '3':

                //clearList(pHead);   //清空链表

                printf("ListLength(L)=%d\n",ListLength(L));

                printf("\n");

                break;

           case '4':

               //GetNthNodeFromBack(L,find,&e);

                GetMidNode(L, &e);

                printf("链表中间结点的值为:%d\n", e);

                //ListTraverse(L);

                printf("\n");

                break;

           case '0':

                exit(0);

       }

    }

}

快慢指针在解决单链表的一些问题的时候是非常有用的,需要留意。



2025年全国青少年信息素养大赛初赛真题(算法创意实践挑战赛C++初中组:文末附答案) 阅读详情

相关推荐

IC/FPGA笔试/面试题分析(七)建立时间和保持时间类型考题汇总分析

自从召集2020届校招同行加入新建立的“IC/FPGA校招笔试面试交流群“,见识到了很多关于建立时间和保持时间分析的题目,在为别人解答疑惑,以及别人为自己解答疑惑的同时,自己对于知识的理解更加深刻了。 对于建立时间而言,从单独的对触发器的建立时间和保持时间的分析到了对电路(系统)的建立时间到保持时间的分析,前者是核心,后者是扩展,后者建立在前者的基础之上进行推到得到,同时也是芯片内部实际遵循的时...

Reborn Lee 1万+

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

**题目描述:**给定一个未知长度的单链表,如何找到该链表的中间的节点? **解决思路:**①遍历该链表,获得该链表的长度,则确定了中间节点的位置,之后再从头遍历至中间节点。②设置快慢指针*tail、mid,tail的移动速度是mid移动速度的两倍。当tail移动到末尾时,*mid就移动到了中间节点。 ...

写写代码 1028

Langfuse落地教程:从Docker部署到项目接入,掌控LLM调用链路

大模型应用开发中,调用链路的透明度直接决定调试效率与成本控制。可观测性技术通过记录每次请求的输入、输出、模型参数与Token消耗,帮助开发者快速定位问题。Langfuse作为开源LLM可观测性平台,将Trace、Prompt版本管理、评分等能力集成于一体,支持Docker Compose自托管部署,并提供Python/JS SDK与REST API。借助部署后的控制台,团队能够直观追踪RAG检索、Agent工具调用等复杂流程中的每一步耗时与资源占用,实现从黑盒调用到全链路可视化的转变。无论是本地调试、线上排

weixin_29698641的博客 308

面试题:如何快速查找未知长度单链表的中间节点?

面试题:如何快速查找未知长度单链表的中间节点?背景方法普通方法原理代码高级方法原理代码实验过程及结果总代码运行结果总结 背景 偶然接触到一面试题:如何快速查找未知长度单链表的中间节点? 方法 首先想到就是很简单的遍历方法,然后又得知一种快慢指针的方法。 普通方法 原理 普通方法很简单,首先遍历一遍单链表以确定单链表的长度。然后再次从头节点出发循环N/2次即可找到单链表的中间节点。 算法的复杂度为O(N+N/2)=O(3N/2)。 代码 void common_found_List(Linklist *L,i

MZYYZT的博客 767

第五章 PCIe介绍 5.1-5.7

为什么SSD要用PCIe接口?因为它快,比SATA快。通道,PCIe最多可以有32个通道。两个设备之间的PCIe连接,叫做一个Link。如下图,设备A和设备B是个双向连接,两个PCIe设备之间,有专门的发送和接收通道,数据可以同时往两个方向传输,PCIe Spec称这种工作模式为,可以理解为。和PCIe一样,SATA有独立的发送和接收通道。但与PCIe工作模式不一样,同一时间,SATA只有一条通道可以进行数据传输。这种工作模式称为。与SATA单通道不同,PCIe连接可以通过增加通道数扩展带宽。

fengbaobaola的博客 2969

CS算法实战:用MATLAB从零实现SAR点目标成像(附完整代码)

本文详细介绍了如何使用MATLAB从零实现SAR点目标CS成像算法,涵盖Chirp Scaling(CS)算法的核心理论、距离徙动校正(RCMC)和方位压缩等关键步骤。通过完整的代码示例和实战技巧,帮助读者掌握SAR成像处理算法,提升遥感图像处理能力。

weixin_29211309的博客 179

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

普通的方法很简单,首先遍历一遍单链表以确定单链表的长度L。然后再次从头节点出发循环L/2次找到单链表的中间节点。算法复杂度为O(L+L/2)=O(3L/2)。 能否再优化一下这个时间复杂度呢?有一个很巧妙的方法:设置两个指针* fast、*slow都指向单链表的头节点。其中* fast的移动速度是* slow的2倍。当* fast指向末尾节点的时候,slow正好就在中间了。这一点利用了在解决判断

leona2108的专栏 723

181、LLC谐振变换器的PCB设计实战(文件归档)

PCB设计实战经验总结:LLC谐振变换器的关键要点 本文通过实际案例总结了LLC谐振变换器PCB设计中的核心经验和常见误区。重点包括: 文件命名规范(项目代号_板卡类型_版本号_日期格式) 四层板标准层叠结构设计要点 谐振回路走线原则(宽度、长度控制) 地线处理技巧(功率地/控制地隔离) 散热设计注意事项(MOSFET过孔阵列、变压器布局) 完整的文件归档清单(Gerber、钻孔、装配图等) 作者特别强调,良好的设计归档习惯能显著降低生产问题概率,建议采用双重备份机制。文中多个真实案例(如谐振频率偏移、EM

Jack010169的博客 43

如何快速找到长度未知单链表的中间节点 -- 快慢指针法

据说是腾讯的一个面试题 问题:已知一个长度未知单链表,如何快速找到中间位置的节点? 长度未知 单向链表 分析问题 目的:找到最中间位置的节点。其实就是一个我们如何去遍历这个单链表的问题。 初步上手 单链表的特性大家都知道,只能单向遍历,而且此处还不知道链表的长度。一种方法是:先遍历找到链表长度n,然后我们遍历(n+1)/2次,让指针指向链表一半的位置出的节点,此时就是链表的中间位置(忽略偶数长...

GuoningningPro的博客 765

【以太网硬件六】1000base-T物理层编码究竟是怎么编的?

详述1000base-T物理层4D-PAM5的编码过程

highman110的博客 5324

堆一呼一吸之间:动态扩缩容引发JVM堆内存震荡的伸缩算法、代际传导与容器定容解析

Kubernetes扩容后,新Java实例的GC频率常比老实例高出数倍,堆容量反复伸缩。本文从一次支付系统的GC陡增出发,结合HotSpot源码与JDK 8实测,拆解堆伸缩的记账规则:期望容量以GC后已用量为基数、以Xms为下限,按空闲比例判断扩缩,收缩只在老年代回收后按0%、10%、40%、100%步进;再剖析年轻代随老年代联动、晋升风暴与元空间触发线,对比Parallel、G1、ZGC等收集器及JDK 26的变化,讨论容器分账、HPA共振与原地扩缩容,最后给出分级定容、预热与监控的方案。

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 15万+

线性表——单链表的魅力(4)快速找到未知长度单链表的中间节点

题目:快速找到未知长度单链表的中间节点 普通节点: 1.遍历一遍单链表以确定单链表的长度L; 2.再从头节点出发循环L/2次找到单链表的中间节点 复杂度:O(L+L/2)=O(3L/2) 优化利用快慢指针: 快慢指针原理:设置两个指针search、mid都指向单链表的头节点。其中search的移动速度是mid的2倍。当*search指向末尾节点的时候。mid正好就在中间了,这是标尺思想。 代码块 int GetMidNode(LinkList L, ElemType e) { LinkList s

wh1236666的博客 226

(十二)深入理解蓝牙BLE之“移植Bluez 5.18源码到嵌入式平台”

在某嵌入式平台进行蓝牙开发,发现上面居然没有btmon,hciattach,hcitool等蓝牙调试工具,无奈之下,只好移植bluez协议栈到目标嵌入式平台,建议移植5.18版本(最新的5.54版本居然hcitool等工具不是默认编译的,需要修改Makefile才可以)。 看到很多讲解移植过程的文章都是需要积分的,觉得写一篇免积分的文章还是有些意义的,欢迎同行来交流。 移植环境:Linux ubuntu 目标平台:sigmastar 星宸科技 配置交叉编译工具链:export PATH=$PATH:

2964

快速找到未知长度单链表的中间节点。(腾讯)

题目:快速找到未知长度单链表的中间节点。 既然是面试题就一定有普通方法和高级方法,而高级方法无疑会让面试官大大加分! 普通的方法很简单,首先遍历一遍单链表以确定单链表的长度L。然后再次从头节点出发循环L/2次找到单链表的中间节点。 算法复杂度为:O(L+L/2)=O(3L/2)。   能否再优化一下这个时间复杂度呢? 有一个很巧妙的方法:利用快慢指针!

白话机器学习 901

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

快速找到未知长度单链表的中间节点(快慢指针)

快慢指针原理: 设置两个指针 *search、*mid 都指向单链表的头节点。其中 *search 的移动速度是 mid 的2倍。当search指向末尾节点的时候,*mid正好就在中间了。这也是标尺的思想。 #include "stdio.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 typedef int Sta...

lsssssssssssy的博客 280

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【java数据结构与算法学习】快慢指针---快速找到未知长度单链表的中间节点

如题:快速找到未知长度单链表的中间节点第一种方法是大多人都能想到的方法:先遍历整个链表得到链表的长度,然后遍历链表的一半,找到链表的中间节点。此操作的时间复杂度是O(n)+O(n/2) = O(3n/2),该方法就不再进行代码的展示了。第二种方法就比较巧妙了,是运用的快慢指针的原理。我们设置两个指针,其中一个指针移动的速度是另一个指针移动速度的两倍,这样当快的指针移动到链表结束位置的时候,慢的指针...

Zer01ne的博客 1275

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

题目:C++快速找到未知长度单链表的中间节点。普通方法和高级方法2种解题思路解析。

题目:C++快速找到未知长度单链表的中间节点。普通方法和高级方法2种解题思路解析。

qq_35320456的博客 646

算法面试题:快速找到未知长度单链表的中间节点

有道算法面试题:快速找到未知长度单链表的中间节点。 你可以普通方法也可用比较好的方法,去解决这个问题。 由于单链表不知道长度,必须遍历完整个单链表才知道单恋表的长度,然后根据一般的长度去找中间结点,这是普通方法。 当然题目问的是快速找到,当然要用快速的方法啦。 这里我们快慢指针的方法来解决这个问题,快指针每次走2个结点,慢指针每次走1个结点,当快指针走完链表,慢指针刚好走到中间,这就是快慢

重庆李四 5122
上一篇: 数组分割
下一篇: 如何测试洗牌程序
cool_bomb
博客等级 码龄18年 29粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值