• 定义链表节点Node
  1. class Node {
  2. private int Data;// 数据域
  3. private Node Next;// 指针域
  4.  
  5. public Node(int Data) {
  6. // super();
  7. this.Data = Data;
  8. }
    get/set方法省略
  9. }
  • 创建链表数据
  1. public static Node getNode() {
  2. Node head = new Node(0);
  3. Node node1 = new Node(1);
  4. Node node2 = new Node(2);
  5. Node node3 = new Node(3);
  6. Node node4 = new Node(4);
  7. head.setNext(node1);
  8. node1.setNext(node2);
  9. node2.setNext(node3);
  10. node3.setNext(node4);
  11. node4.setNext(node2);
  12. return head;
  13. }
  1. 判断单向链表是否有环  采用快慢步长法。令两个指针p和q分别指向头结点,p每次前进一步,q每次前进两步,如果p和q能重合,则有环。可以这么理解,这种做法相当于p静止不动,q每次前进一步,所有肯定有追上p的时候
  1. // 判断链表是否有环
  2. public static boolean loop(Node head) {
  3. Node slow = head;
  4. Node fast = head;
  5.  
  6. // 如果链表为空或者只有一个节点当作链表有环
  7. while (slow != null && slow.getNext() != null) {
  8. slow = slow.getNext();
  9. fast = fast.getNext().getNext();
  10. if (slow == fast) {
  11. return true;
  12. }
  13. }
  14. return false;
  15. }

2.翻转链表

  1. /**
  2. * 递归,在反转当前节点之前先反转后续节点
  3. */
  4. public static Node Reverse1(Node head) {
  5. // head看作是前一结点,head.getNext()是当前结点,reHead是反转后新链表的头结点
  6. if (head == null || head.getNext() == null) {
  7. return head;// 若为空链或者当前结点在尾结点,则直接还回
  8. }
  9. Node reHead = Reverse1(head.getNext());// 先反转后续节点head.getNext()
  10. head.getNext().setNext(head);// 将当前结点的指针域指向前一结点
  11. head.setNext(null);// 前一结点的指针域令为null;
  12. return reHead;// 反转后新链表的头结点
  13. }

3.求单向链表(有环)求环的入口

  1. // 从碰撞点 x 前进 a 步即为连接点。 从 x 点和从起点同步前进,第一个碰撞点就是连接点。
  2. public static Node findLoopPort(Node head) {
  3. Node slow = head;
  4. Node fast = head;
  5.  
  6. while (slow != null && slow.getNext() != null) {
  7. slow = slow.getNext();
  8. fast = fast.getNext().getNext();
  9. if (slow == fast) {
  10. break;
  11. }
  12. }
  13.  
  14. if (slow == null || slow.getNext() == null) {
  15. return null;
  16. }
  17. fast = head;
  18.  
  19. while (slow != fast) {
  20. slow = slow.getNext();
  21. fast = fast.getNext();
  22. }
  23. System.out.println("环的连接点是" + slow.getData());
  24. return slow;
  25. }

JAVA处理链表经典问题的更多相关文章

  1. Java中的经典算法之冒泡排序(Bubble Sort)

    Java中的经典算法之冒泡排序(Bubble Sort) 神话丿小王子的博客主页 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一 ...

  2. Java中的经典算法之选择排序(SelectionSort)

    Java中的经典算法之选择排序(SelectionSort) 神话丿小王子的博客主页 a) 原理:每一趟从待排序的记录中选出最小的元素,顺序放在已排好序的序列最后,直到全部记录排序完毕.也就是:每一趟 ...

  3. JAVA单向链表实现

    JAVA单向链表实现 单向链表 链表和数组一样是一种最常用的线性数据结构,两者各有优缺点.数组我们知道是在内存上的一块连续的空间构成,所以其元素访问可以通过下标进行,随机访问速度很快,但数组也有其缺点 ...

  4. Java单链表反转 详细过程

    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/guyuealian/article/details/51119499 Java单链表反转 Java实 ...

  5. Java 单向链表学习

    Java 单向链表学习 链表等同于动态的数组:可以不同设定固定的空间,根据需要的内容动态的改变链表的占用空间和动态的数组同一形式:链表的使用可以更加便于操作. 链表的基本结构包括:链表工具类和节点类, ...

  6. Java Web入门经典扫描版

    全书共分4篇19章,其中,第一篇为“起步篇”,主要包括开启JavaWeb之门.不可不知的客户端应用技术.驾驭JavaWeb开发环境.JavaWeb开发必修课之JSP语法等内容:第二篇为“核心篇”,主要 ...

  7. java、八大经典书籍,你看过几本?

    java.八大经典书籍,你看过几本? 转载  一.Java从入门到精通 <Java从入门到精通(第3版)>从初学者角度出发,通过通俗易懂的语言.丰富多彩的实例,详细介绍了使用Java语言进 ...

  8. java 单链表 练习

    练习一下java单链表的简单习题 package com.test1; import java.util.Stack; public class SingleListDemo { /** * 返回单链 ...

  9. Java中的经典算法之快速排序(Quick Sort)

    Java中的经典算法之快速排序(Quick Sort) 快速排序的思想 基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小, 然后再按此方法对 ...

随机推荐

  1. python面向编程:类的组合、封装、property装饰器、多态

    一.组合 二.封装 三.propert装饰器 四.多态 一.组合 ''' 1. 什么是组合 一个对象的属性是来自于另外一个类的对象,称之为组合 2. 为何用组合 组合也是用来解决类与类代码冗余的问题 ...

  2. QTP(9)

    常用的Windows控件 WinEdit---Set "数据值" SetSecure "加密数值" WinButton---Click WinComboBox- ...

  3. 数据库——Oracle(6)

    1 默认值约束(默认值):对表中的某个列提前设置好默认值,当执行插入操作的时候,如果该列没有插入列值,则系统会自动的插入之前设置的默认值. 1)每个列只能插入一个默认值. 2)创建表的时候设置默认值. ...

  4. 记一下拷贝windows下文件到linux下的方法

    去官网下载的Putty中包含了如下文件: 其中pscp.exe是一个远程复制文件的工具. 官网:https://www.chiark.greenend.org.uk/~sgtatham/putty/l ...

  5. mybatic进阶遗留

    参考文章: MyBatis的架构设计以及实例分析 MyBatis缓存机制的设计与实现 MyBatis的一级缓存实现详解 及使用注意事项 MyBatis的二级缓存的设计原理

  6. mysql索引设计的注意事项

    mysql索引设计的注意事项 目录 一.索引的重要性 二.执行计划上的重要关注点 (1).全表扫描,检索行数 (2).key,using index(覆盖索引) (3).通过key_len确定究竟使用 ...

  7. 一步一步带你安装史上最难安装的 vim 插件

    YouCompleteMe is a fast, as-you-type, fuzzy-search code completion engine for Vim.参考: https://github ...

  8. AMD 异步模块定义

    1.解决模块加载过慢 2.核心:define函数

  9. countif函数

    EXCEL单元格内数据主要有以下几类:数值型,文本型,逻辑型,错误值型.其中时间类型也是一种特殊的数值.文本类型的数字是文本型. 空单元格:指什么内容也没有的单元格,姑且称之为真空. 假空单元格:指0 ...

  10. WTL自定义控件:edit输入响应

    自定义的edit控件,获取edit输入响应的消息: 头文件部分: BEGIN_MSG_MAP(CCheckEditEx) MESSAGE_HANDLER(WM_CHAR, OnChar) END_MS ...