链表:

是一种物理储存结构上的非连续储存结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。

知道头节点便可以访问链表中的所有节点。

如下代码创建链表类,并访问:

package list;
public class List1 {public static void main(String[] args) {Node head = new Node(7);head.next = new Node(3);head.next.next = new Node(8);head.next.next.next = new Node(5);head.next.next.next.next = new Node(6);Node n = head;  //从头部节点开始访问while (n != null) {  //只要引用了节点就继续访问节点数据System.out.println(n.value);  //访问节点中的数据n = n.next;  //得到n后面的节点,保存到n}}static class Node {//链表类private int value;//节点数据private Node prev;private Node next;public Node(int value) {this.value = value;}}
}

访问中间节点:

通过两个变量,变量fast走一步,变量slow走两步以此求出中间值。

偶数情况求中间值过程:

奇数情况求中间值过程:

代码如下:

package list;
public class ZhongJianJieDian {public static void main(String[] args) {Node head = new Node(7);head.next = new Node(3);head.next.next = new Node(8);head.next.next.next = new Node(5);head.next.next.next.next = new Node(6);Node mid = middleNode(head);System.out.println(mid.value);//Node n = head;  //从头部节点开始访问//while (n != null) {  //只要引用了节点就继续访问节点数据//    System.out.println(n.value);  //访问节点中的数据//    n = n.next;  //得到n后面的节点,保存到n//}}private static Node middleNode(Node head) {Node fast = head; //快引用,引用头部节点Node slow = head; //慢引用,引用头部节点//fast在范围内并且它的下一个也不是nullwhile (fast != null && fast.next != null) {//两种情况fast = fast.next.next; //fast向后引用下两个节点slow = slow.next; //slow向后引用下一个节点}return slow; //循环结束slow所引用的节点,就是中间节点}static class Node {private int value;private Node prev;private Node next;public Node(int value) {this.value = value;}}
}

环形链表:

将末位置引用链接一个位置形成一个环(注意:一个也可以形成环,自己链接自己)

同样通过两个变量,变量fast走一步,变量slow走两步,当两个值重合时便说明有环形。否则fast走到末尾结束便无环形。

有环形链表的情况:

无环形链表的情况:

package list;public class HuanXingLianBiao {public static void main(String[] args) {Node head = new Node(8);head.next = new Node(2);head.next.next = new Node(3);head.next.next.next = new Node(1);head.next.next.next.next = new Node(9);head.next.next.next.next.next = head.next; //形成环,从末尾节点应用前面的节点boolean b = hasCircle(head);System.out.println("是否有环:"+b);}/*思路: 用快慢指针,快指针每次移动两步,慢指针每次移动一步,如果移动过程中,快慢指针重合,就表示有环;如果快指针都移动结束,就表示没有环。1. 变量fast, slow,都引用头部节点2. 进入循环,执行条件:fast!=null,并且fast.next!=null3. fast和slow一次次向后移动4. fast和slow如果引用同一个节点,直接返回true5. 循环结束,没有环,返回false*/private static boolean hasCircle(Node head) {Node fast = head; //快指针Node slow = head; //慢指针//fast在中间位置,还可以继续向后移动while (fast != null && fast.next != null) {fast = fast.next.next; //fast走两步slow = slow.next;      //slow走一步if (fast == slow) {    //fast有没有绕回来,和slow重合return true;       //重合就是有环}}return false; //fast不能再继续向后移动时,就是没有环}static class Node {int value;Node prev;Node next;Node(int value) {this.value = value;}}
}

翻转链表:

翻转链表: 从头部节点开始,一个节点一个节点地拆出来,重新反向连接

代码如下,具体步骤见注释:

package list;public class FanZhuanLianBiao {public static void main(String[] args) {Node head = new Node(1);head.next = new Node(2);head.next.next = new Node(3);head.next.next.next = new Node(4);head.next.next.next.next = new Node(5);Node head2 = fanZhuan(head);Node n = head2;while (n != null) {System.out.println(n.value);n = n.next;}}/*翻转链表思路: 从头部节点开始,一个节点一个节点地拆出来,重新反向连接1. 变量current,先引用头部节点2. 变量next,表示新链表中的下一个节点,开始是null3. 进入循环,循环条件:current!=null4. 定义tmp变量表示当前节点的下一个节点5. current的下一个,引用next6. 修改next变量,引用current节点7. 修改current变量,引用tmp节点8. 循环结束后,next引用的节点,就是新的头部节点,直接返回next*/private static Node fanZhuan(Node head) {if (head == null || head.next == null) {return head;}Node current = head;Node next = null;while (current != null) {Node tmp = current.next;current.next = next;next = current;current = tmp;}return next;}static class Node {int value;Node prev;Node next;Node(int value) {this.value = value;}}
}

[链表]链表寻找中间点环形链表反转链表相关推荐

  1. 【链表习题集1】整体和局部反转链表同频和快慢指针合并链表

    前言: 刷题和面试兼顾还得看你啊-牛客网 近几年互联网受疫情影响,许多互联网都使用牛客网在线笔试招人 很多同学因为不熟悉牛客网的环境和使用,最后在线笔试面试中屡屡受挫 牛客网提供了语言巩固,算法提高等 ...

  2. 13,反转链表《剑指offer》

    题目: 输入一个链表,反转链表后,输出链表的所有元素. 思路: 反转链表,对于片段 1--->2--->3循环操作: 要反转链表需要两步: 一,将2->next指向1 (如果不保存3 ...

  3. 【LeetCode】剑指 Offer 24. 反转链表

    剑指 Offer 24. 反转链表 文章目录 剑指 Offer 24. 反转链表 一.迭代 二.递归 总结 一.迭代 在遍历链表时,将当前节点的 next 指针改为指向前一个结点.由于结点没有引用其前 ...

  4. 剑指 Offer II 024. 反转链表

    注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点. 示 ...

  5. [Python] 反转链表相关技巧

    前言 给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头. 要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n)  ...

  6. c语言最大字符1025,1025 反转链表 (25 分)C语言

    题目描述 给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转.例如:给定L为1→2→3→4→5→6,K为3,则输出应该为 3→2→1→6→5→4:如果K为4,则输出应该为4→3→2→1→5 ...

  7. 反转链表、旋转链表算法总结

    目录 反转链表(力扣:206) 反转链表 II(力扣:92) 旋转链表(力扣:61) 算法实现 1. 反转链表 题目 反转一个单链表. 思路 该题比较简单.这里涉及到3个节点:前一个节点.当前节点和后 ...

  8. 反转链表与拓展【灵神基础精讲】

    来源0x3f:https://space.bilibili.com/206214 文章目录 反转链表 [206. 反转链表](https://leetcode.cn/problems/reverse- ...

  9. 反转链表-python

    leetCode第206题 反转链表. 链接:https://leetcode-cn.com/problems/reverse-linked-list 给你单链表的头节点 head ,请你反转链表,并 ...

最新文章

  1. Asp.net 身份验证、授权概述
  2. PHP 使用POST 获取不到部分数据问题
  3. DELPHI的DBGRID有两个难点
  4. php-cgi.exe系统错误 无法启动程序,因为计算机中丢失api-ms-win-crt-conio-l1-1-0.dll 尝试解决安装该程序以解决此问题
  5. 13行代码AC_习题3-9 子序列 (UVa10340,All in All)
  6. java中集合选取怎么选_集合中的可选
  7. oracle sql 执行计划分析_从Oracle数据库实验来看索引的常见执行计划
  8. python fun函数的功能是_python编程。假定输入字符串中只包含字母和*号,请编写函数fun,它的功能是将字符串中间的*号...
  9. python lambda函数介绍
  10. 数仓建模—数仓建模实战(建模流程/建模工具)
  11. R、冗余分析(RDA)、ggplot2、置信椭圆
  12. 国开计算机专业英语答案,国开电大计算机专业英语阅读(河北)形考三参考答案...
  13. 谈谈Python的编译和反编译
  14. 【云原生】-Docker部署SQL Server及最佳应用
  15. WiFi基本概念(八)(信道估计 L-STF,L-LTF,Pilots)
  16. 万兆局域网方案_家庭基础万兆网络——最简单的方案
  17. matlab中绘制图像
  18. java_枚举类型(支付方式枚举)
  19. Office 顿号怎么输
  20. Mat 的介绍和使用

热门文章

  1. 开篇-五年的工作总结与接下来的的学习方向
  2. 观察者Observe(刷新数据)
  3. SQL去掉字符串中前面和后面的逗号
  4. 存储网关CSG助力企业上云
  5. python字典由什么组成_python字典
  6. Visio画图打印为pdf另存为eps插入latex后,图片显示不全
  7. 【阿里云资讯】如何让云计算安全变得更“聪明”
  8. 老公的忏悔(看了笑S你)
  9. 甜甜甜!HTML5 快速实现一颗告白爱心树!| 原力计划
  10. QT实时视频播放界面设计