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

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

普通方法:首先遍历一遍单链表,以确定单链表的长度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;
} 

原文地址:https://www.cnblogs.com/geziyu/p/9897991.html

时间: 2024-08-04 22:14:36

快速找到未知长度的单链表的中间结点的相关文章

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

package com.java.dataStruct; //节点类 public class Node<E> { E item; Node next; public Node(){ } public Node(E element){ this.item = element; } public Node(E element, Node next){ this.item = element; this.next = next; } } Node p1,r1; Node L1 = new Node

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

在讨论之前,我们首先首先要明白,什么是单链表? 单链表:链接方式存储的线性表 单链表的结点结构  ┌──┬──┐  │data│next│  └──┴──┘       data域--存放结点值的数据域      next域--存放结点的直接后继的地址(位置)的指针域(链域)注意:    ①链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的.    ②每个结点只有一个链域的链表称为单链表(Single Linked List). 那么我们先用java设计一下我们的单链表 publi

数据结构(一)线性表单链表试题

题目 快速找到未知长度的单链表的中间节点 解决思路 (一)使用一个指针,先索引一遍获取总长度,再取长度一半去循环获取到中间值 算法复杂度:O(L)+O(L/2) = O(3L/2) (二)使用两个指针,快指针和慢指针,快指针一次向前走2格,慢指针一次走一格,当快指针走完全程,慢指针正好走在中间 算法复杂度:O(L/2) 方法二:代码实现 //快速查找中间元素 int FindMidEle(LinkList L, Elemtype *e) { LinkList search, middle; //

单链表-快慢指针

快慢指针: 定义两个指针,一个快,一个慢,可以有多种用途.例如:快速找到位置长度单链表中的中间结点:对于循环链表中利用快慢指针也可以判断是否存在环. 快速找到位置长度单链表中的中间结点 1)使用一个指针,先索引一遍获取总长度,再取长度一半去循环获取到中间值:O(3L/2). 2)使用两个指针,快指针和慢指针,快指针一次向前走2格,慢指针一次走一格,当快指针走完全程,慢指针正好走在中间:O(L/2). 代码实现: //快速查找中间元素 int FindMidEle(LinkList L, Elem

单链表 知识点学习--Android地基系列(一)

嗯,看别人整理过,自己再做的笔记,题目都是常见的必考题目,嘻嘻嘻,单链 表的基础知识我就不写了,太多人写了. 看前注意!!!!!!!涉及C知识较多,C知识我以后再考虑是否写一篇附加文 可以辅助以后的Android必备地基系列博文 struct ListNode { int data; ListNode * Next; }; 1.求链表中结点个数 思路:若链表为空,返回0:循环判断链表下一个指针是否为空,no,长度++(初始化用unsigned int  length = 0),直到下一个为nul

数据结构关于单链表的一些操作的源代码

单链表的可以有许多问题,这是我特意整理一下的有关他的相关操作,给出代码,有需要的可以自己调试,重要的就是关于环的一些操作: #include <iostream>#include <cstdio>#include <cstdlib>#include <ctime>using namespace std;typedef int Elemtype;typedef struct Node{ Elemtype data; struct Node *next;}Nod

对带头结点的单链表的简单操作

#pragma once #include<stdio.h> #include<stdlib.h> #include<assert.h> #include<memory.h> #define DataType int           //int 可以改写为其它数据类型 typedef struct Node { DataType data; struct Node *next; }Node,*pNode;          //定义结点结构体      

数据结构(一) 单链表的实现-JAVA

数据结构还是很重要的,就算不是那种很牛逼的,但起码得知道基础的东西,这一系列就算是复习一下以前学过的数据结构和填补自己在这一块的知识的空缺.加油.珍惜校园中自由学习的时光.按照链表.栈.队列.排序.数组.树这种顺序来学习数据结构这门课程把. -WH 一.单链表的概念 链表是最基本的数据结构,其存储的你原理图如下图所示 上面展示的是一个单链表的存储原理图,简单易懂,head为头节点,他不存放任何的数据,只是充当一个指向链表中真正存放数据的第一个节点的作用,而每个节点中都有一个next引用,指向下一

单链表实现及其基本操作

import java.util.HashMap; import java.util.Scanner; import java.util.Stack; /** * * @author kerryfish * 关于java中链表的操作 * 1. 求单链表中结点的个数: getListLength * 2. 将单链表反转: reverseList(遍历),reverseListRec(递归) * 3. 查找单链表中的倒数第K个结点(k > 0): reGetKthNode * 4. 查找单链表的中间