Q:链表的中间元素
2024-10-18 05:33:27
问题:如何得到一个链表的中间元素?
相信,这个问题对于刚入门编程的人来说,都不会难,最自然而然的想法是先遍历一遍链表,统计链表中的元素的个数,之后,再走一遍链表,所走的步长为链表长度的一半。这样就能获得链表的中间元素的值。但是,我们能不能有一种方法是只走一遍链表便得到结果的呢?当然是有的。不然我也不会写成博文总结学到的知识点了。哈哈哈哈~~(杠铃般的笑声)
一种比较有趣的解法是:
- 初始化两个指针a,b。其均指向链表的头节点处
- a指针每次走一步,b指针每次走两步(a指针称为慢指针,b指针称为快指针)
- 当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
最新文章
- mybatis_开发篇
- 5分钟开启Esper之旅
- 对json排序
- 同一内网不能网段ping 不通
- BABOK2主要概要输入输出图
- Java动态代理 cglib
- SQL注入测试平台 SQLol -4.UPDATE注入测试
- 创建eclipse新的workspace并设置workspace共享配置
- C++ Primer 有感(异常处理)
- Winform 窗体设计器 无法识别重复成员变量声明的问题
- webservice发送字符串
- MySQL复制表结构,表数据。
- 使用FusionCharts出柱状图和饼状图
- 201521123007《Java程序设计》第6周学习总结
- C#实现注册表 LocalMachine 目录下CURD工具类
- MySQL数据库存储引擎
- PHP 【六】
- list-列表练习
- 利用exif.js解决ios或Android手机上传竖拍照片旋转90度问题
- andorid——自定义seekbar(转)