[链表]链表寻找中间点环形链表反转链表
链表:
是一种物理储存结构上的非连续储存结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。
知道头节点便可以访问链表中的所有节点。
如下代码创建链表类,并访问:
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】整体和局部反转链表同频和快慢指针合并链表
前言: 刷题和面试兼顾还得看你啊-牛客网 近几年互联网受疫情影响,许多互联网都使用牛客网在线笔试招人 很多同学因为不熟悉牛客网的环境和使用,最后在线笔试面试中屡屡受挫 牛客网提供了语言巩固,算法提高等 ...
- 13,反转链表《剑指offer》
题目: 输入一个链表,反转链表后,输出链表的所有元素. 思路: 反转链表,对于片段 1--->2--->3循环操作: 要反转链表需要两步: 一,将2->next指向1 (如果不保存3 ...
- 【LeetCode】剑指 Offer 24. 反转链表
剑指 Offer 24. 反转链表 文章目录 剑指 Offer 24. 反转链表 一.迭代 二.递归 总结 一.迭代 在遍历链表时,将当前节点的 next 指针改为指向前一个结点.由于结点没有引用其前 ...
- 剑指 Offer II 024. 反转链表
注:本文的代码实现使用的是 JS(JavaScript),为前端中想使用JS练习算法和数据结构的小伙伴提供解题思路. 描述 给定单链表的头节点 head ,请反转链表,并返回反转后的链表的头节点. 示 ...
- [Python] 反转链表相关技巧
前言 给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头. 要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) ...
- 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 ...
- 反转链表、旋转链表算法总结
目录 反转链表(力扣:206) 反转链表 II(力扣:92) 旋转链表(力扣:61) 算法实现 1. 反转链表 题目 反转一个单链表. 思路 该题比较简单.这里涉及到3个节点:前一个节点.当前节点和后 ...
- 反转链表与拓展【灵神基础精讲】
来源0x3f:https://space.bilibili.com/206214 文章目录 反转链表 [206. 反转链表](https://leetcode.cn/problems/reverse- ...
- 反转链表-python
leetCode第206题 反转链表. 链接:https://leetcode-cn.com/problems/reverse-linked-list 给你单链表的头节点 head ,请你反转链表,并 ...
最新文章
- Asp.net 身份验证、授权概述
- PHP 使用POST 获取不到部分数据问题
- DELPHI的DBGRID有两个难点
- php-cgi.exe系统错误 无法启动程序,因为计算机中丢失api-ms-win-crt-conio-l1-1-0.dll 尝试解决安装该程序以解决此问题
- 13行代码AC_习题3-9 子序列 (UVa10340,All in All)
- java中集合选取怎么选_集合中的可选
- oracle sql 执行计划分析_从Oracle数据库实验来看索引的常见执行计划
- python fun函数的功能是_python编程。假定输入字符串中只包含字母和*号,请编写函数fun,它的功能是将字符串中间的*号...
- python lambda函数介绍
- 数仓建模—数仓建模实战(建模流程/建模工具)
- R、冗余分析(RDA)、ggplot2、置信椭圆
- 国开计算机专业英语答案,国开电大计算机专业英语阅读(河北)形考三参考答案...
- 谈谈Python的编译和反编译
- 【云原生】-Docker部署SQL Server及最佳应用
- WiFi基本概念(八)(信道估计 L-STF,L-LTF,Pilots)
- 万兆局域网方案_家庭基础万兆网络——最简单的方案
- matlab中绘制图像
- java_枚举类型(支付方式枚举)
- Office 顿号怎么输
- Mat 的介绍和使用