问题:如何得到一个链表的中间元素?

  相信,这个问题对于刚入门编程的人来说,都不会难,最自然而然的想法是先遍历一遍链表,统计链表中的元素的个数,之后,再走一遍链表,所走的步长为链表长度的一半。这样就能获得链表的中间元素的值。但是,我们能不能有一种方法是只走一遍链表便得到结果的呢?当然是有的。不然我也不会写成博文总结学到的知识点了。哈哈哈哈~~(杠铃般的笑声)

  一种比较有趣的解法是:

  1. 初始化两个指针a,b。其均指向链表的头节点处
  2. a指针每次走一步,b指针每次走两步(a指针称为慢指针,b指针称为快指针)
  3. 当b指针直线末尾的时候,a指针所指向的节点便是链表的中间节点

具体代码如下:

/**
* @author 学徒
* 用于得到链表的中间元素
*/
public class MiddleNode {
/**
* 链表的节点
*
* @param <T> 链表的元素值
*/
static class Node<T> {
//节点值
T value;
//节点的下一个节点的指针
Node<T> next; public Node(T value) {
this(value, null);
} public Node(T value, Node next) {
this.next = next;
this.value = value;
}
} /**
* 用于获取链表的中间节点
*
* @return 链表的中间节点
*/
public Node getMiddle(Node head) {
if (head == null) {
return null;
}
Node a = head, b = head;
while (true) {
if (b==null||b.next == null) {
break;
}
b=b.next.next;
a=a.next;
}
return a;
} public static void main(String[] args){
Node<String> a=new Node<String>("A");
Node<String> b=new Node<String>("B");
Node<String> c=new Node<String>("C");
Node<String> d=new Node<String>("D");
Node<String> e=new Node<String>("E");
a.next=b;
b.next=c;
c.next=d;
d.next=e;
MiddleNode list=new MiddleNode();
Node result=list.getMiddle(a);
System.out.println(result.value);
}
} 其中,测试用的链表如下: A-->B-->C-->D-->E

回到目录|·(工)·)

Q:链表的中间元素的更多相关文章

  1. SDUT OJ 数据结构实验之链表七:单链表中重复元素的删除

    数据结构实验之链表七:单链表中重复元素的删除 Time Limit: 1000 ms Memory Limit: 65536 KiB Submit Statistic Discuss Problem ...

  2. SDUT-2122_数据结构实验之链表七:单链表中重复元素的删除

    数据结构实验之链表七:单链表中重复元素的删除 Time Limit: 1000 ms Memory Limit: 65536 KiB Problem Description 按照数据输入的相反顺序(逆 ...

  3. javascript中的链表结构—从链表中删除元素

    1.概念 上一个博文我们讲到链表,其中有一个方法remove()是暂时注释的,这个方法有点复杂,需要添加一个Previous()方法找到要删除的元素的前一个节点,这一个博文我们来分析一下这个remov ...

  4. LeetCode: 2_Add Two Numbers | 两个链表中的元素相加 | Medium

    题目: You are given two linked lists representing two non-negative numbers. The digits are stored in r ...

  5. 在链表中,元素的"位序"概念淡化,结点的"位置"概念淡化

    在链表中,元素的"位序"概念淡化,结点的"位置"概念淡化 1 结点的描述与实现 C语言中用带指针的结构体类型来描述 typedef struct Lnode { ...

  6. leetcode - 链表两两元素交换 + 判断链表有无环

    链表两两元素交换 给定一个链表,两两交换其中相邻的节点,并返回交换后的链表. 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换. 示例: 给定 1->2->3->4, 你 ...

  7. LintCode之删除链表中的元素

    题目描述 我的代码 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode n ...

  8. 根据存放位置数据的链表P打印链表L的元素

    题目:给定一个链表L和另一个链表P,它们包含以升序排列的整数.操作printLots打印L中那些由P所指定的位置上的元素.写出过程printLots(L,P).只可以使用公有的STL容器操作.该过程的 ...

  9. [google面试CTCI] 2-1.移除链表中重复元素

    [链表] Q:Write code to remove duplicates from an unsorted linked list      FOLLOW UP      How would yo ...

随机推荐

  1. iOS推送功能极光推送的介绍与实现

    1.个人整理操作流程 2.官方使用说明流程 2018iOS极光推送完整流程 极光推送官网

  2. elk部署心得

    一.ElasticSearch 部署 1.配置文件里node.name 要不一致. vim /etc/elasticsearch cluster.name: aubin-cluster # 集群名称 ...

  3. 进程控制块(PCB)

    用来描述和控制进程的运行的一个数据结构--进程控制块PCB(Process Control Block),是进程实体的一部分,是操作系统中最重要的记录型数据结构. PCB是进程存在的唯一标志 系统能且 ...

  4. 一:My Batis快速入门

    ---恢复内容开始--- 一.Mybatis介绍 MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架.MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检 ...

  5. 用absolute进行页面的自适应布局

    用position:absolute和top,left,bottom,right进行设置可以进行页面的头部,底部,左边框,内容的自适应布局,可以代替position:fixed; <!DOCTY ...

  6. 死锁、Lock锁、等待唤醒机制、线程组、线程池、定时器、单例设计模式_DAY24

    1:线程(理解) (1)死锁 概念: 同步中,多个线程使用多把锁之间存在等待的现象. 原因分析: a.线程1将锁1锁住,线程2将锁2锁住,而线程1要继续执行锁2中的代码,线程2要继续执行锁1中的代码, ...

  7. shell脚本批量部署ssh

    日常运维工作中,需要给几十上百台服务器批量部署软件或者是重启服务器等操作, 这样大量重复性的工作一定很苦恼,本文给大家提供了最基本的批量操作的方法,虽然效率不高,对于初学者来说还是好理解.由于刚开始学 ...

  8. 第7章—SpringMVC高级技术—不用web.xml,而使用java类配置SpringMVC

    不用web.xml,而使用java类配置SpringMVC DispatcherServlet是Spring MVC的核心,按照传统方式, 需要把它配置到web.xml中. 我个人比较不喜欢XML配置 ...

  9. PHP 如何 安全配置

    配置选项 phpinfo( ) 函数可用于php.ini文件的定位 A.1. allow_url_fopen 选项允许你如同本地文件一样引用远程资源: 我推荐关闭allow_url_fopen选项,除 ...

  10. IDEA Community(社区版)再谈之无奈之下还是去安装旗舰版

    不多说,直接上干货! 前言 相信很多人,跟我一样,一开始,接触spark,肯定会首选IntelliJ IDEA的社区版Community. IntelliJ IDEA号称当前Java开发效率最高的ID ...