循环控制-链表反转(与创建链表)
0.目录
1.循环控制
2.Java代码实现
- 2.1 创建链表和递归反转实现
- 2.2 循环反转思路
- 2.3 链表反转的实现
- 2.4 测试用例
- 2.5 循环控制-创建链表
1.循环控制
循环书写方法:
- 定义循环不变式,并在循环体每次结束后保持循环不变式
- 先一般 ,后特殊
- 每次 必须 向前推进循环不变式中涉及的变量值
- 每次推进的规模必须为 1
循环不表示(loop invariant):是一句断言定义各变量所满足的条件
2.Java代码实现
2.1 创建链表和递归反转实现
前面已经写过递归的版本了,传送门:
递归控制-链表反转
本篇结点和创建链表的实现同前文 递归控制-创建链表
2.2 循环反转思路
1.先考虑循环中的某一个情况——循环到3时,应该要实现哪些操作?
2.此时应该要把3 → 4的指针改为3 → 2,而4作为剩下的第一个结点。
为了实现这一功能,加入两个指针newHead(指向反转成功的链表)和curHead(指向还没有反转的链表):
3.所以每一次循环做的操作就是跟随两个指针往后移:
4.总体来看就是用两个指针从头循环到尾一步步地反转链表:
2.3 链表反转的实现
依据反转思路实现循环代码即可。
public Node reverseLinkedList(Node head) {Node newHead = null;Node curHead = head;// Loop invariant:// newHead points to the linked list already reversed.// curHead points to the linked list not yet reversed.while (curHead != null) {// Loop invariant holds.Node next = curHead.getNext();curHead.setNext(newHead);newHead = curHead;curHead = next;// Loop invariant holds.}// Loop invariant holds.return newHead;}
ps:不需要在开头处理:if(head = null)
,程序也能够很好的处理特殊情况。
验证在循环最后一步时程序的正确性:
while (curHead != null) {// Loop invariant holds.Node next = curHead.getNext(); // next = nullcurHead.setNext(newHead); // curHead.next reversednewHead = curHead; // newHead points to lastcurHead = next; // curHead = null// Loop invariant holds.}
2.4 测试用例
测试程序是否正确运行(采用之前递归实现的测试用例):
public static void main(String[] args) {LinkedListCreator creator = new LinkedListCreator();LinkedListReverser reverser = new LinkedListReverser();Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(new ArrayList<>())));Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(Arrays.asList(1))));Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(Arrays.asList(1, 2, 3, 4, 5))));}
运行结果为
main所在java文件全部代码:
import java.util.ArrayList;
import java.util.Arrays;import interview.common.Node;
import interview.recursion.LinkedListCreator;public class LinkedListReverser {public Node reverseLinkedList(Node head) {Node newHead = null;Node curHead = head;// Loop invariant:// newHead points to the linked list already reversed.// curHead points to the linked list not yet reversed.while (curHead != null) {// Loop invariant holds.Node next = curHead.getNext();curHead.setNext(newHead);newHead = curHead;curHead = next;// Loop invariant holds.}// Loop invariant holds.return newHead;}public static void main(String[] args) {LinkedListCreator creator = new LinkedListCreator();interview.recursion.LinkedListReverser reverser = new interview.recursion.LinkedListReverser();Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(new ArrayList<>())));Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(Arrays.asList(1))));Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(Arrays.asList(1, 2, 3, 4, 5))));}
}
2.5 循环控制-创建链表
最后再把创建链表的递归实现也改为循环实现:
public Node createLargeLinkedList(int size) {Node prev = null;Node head = null;for (int i = 1; i <= size; i++) {Node node = new Node(i);if (prev != null) {prev.setNext(node);} else {head = node;}prev = node;}return head;}
测试一下:
public static void main(String[] args) {LinkedListCreator creator = new LinkedListCreator();interview.recursion.LinkedListReverser reverser = new interview.recursion.LinkedListReverser();Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(new ArrayList<>())));Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(Arrays.asList(1))));Node.printLinkedList(reverser.reverseLinkedList(creator.createLinkedList(Arrays.asList(1, 2, 3, 4, 5))));Node.printLinkedList(reverser.reverseLinkedList(creator.createLargeLinkedList(100)));}
运行结果:
转载于:https://www.cnblogs.com/PyLearn/p/10039206.html
循环控制-链表反转(与创建链表)相关推荐
- Python3 反转一个单链表
Python3 反转一个单链表 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1-&g ...
- 【剑指Offer专题】链表系列:从尾到头打印链表、反转链表、回文链表、合并两个排序的链表(C++和Python实现)...
关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 剑指Offer(三):从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每 ...
- 链表反转相关的题(C++模板)
目录 反转单链表 反转部分单链表 K个一组反转单链表 K个一组反转单链表(从尾结点开始) 反转单链表 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点 输入: 1->2- ...
- 七十、反转和合并链表、 链表有环的判断
@Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 最近在重新梳理学算法的知识,本文为链表常见操作复习的总结文章,会讲解 ...
- 用JAVA语言创建链表的方法
链表刚学习时是用c来学习的,那时候对于结构体,指针这些东西实现链表觉得很合适,但想要应用到java上还是有些不同的 这里,我学习下用java来使用链表的方法: 首先,定义节点类 //链表节点 clas ...
- 【算法系列之三】单链表反转
问题: 实现单链表反转 答案: 链表准备 class Node {private int Data;// 数据域private Node Next;// 指针域public Node(int Data ...
- C++实现链表逆序打印、链表反转
//题目:C++实现链表逆序打印.链表反转 // 如何将链表逆序,取决于题目的要求.如果面试官只要求打印,一般不改动链表结构为好,如果要求改变链表的方向,则需要改变结构,再顺序打印. // 方法1:只 ...
- 【链表】C++链表反转、链表逆序打印
转载地址:http://blog.csdn.net/yebanxin/article/details/51942598 题目:C++实现链表逆序打印.链表反转 如何将链表逆序,取决于题目的要求.如果面 ...
- 【链表】C++链表反转、链表逆序打印(三)
题目:C++实现链表逆序打印.链表反转 如何将链表逆序,取决于题目的要求.如果面试官只要求打印,一般不改动链表结构为好,如果要求改变链表的方向,则需要改变结构,再顺序打印. 方法1:只逆序打印,不改变 ...
- Java单向链表反转
要求 给出单链表的头节点 head ,要求反转链表,并返回反转后的链表. 实现原理 单向链表反转就是将链表的指针方向改变.由于单链表没有指向前一个结点的指针,所以,我们定义一个指向前一个节点的指针pr ...
最新文章
- matlab字母随机排列,matlab_一组数据元素随机排列
- gnome Nautilus cannot handle computer locations
- awstats 安装与配置
- PE结构绑定导入实现
- java图像处理之图像融合
- Python FastApi:post文件与数据/本地端测试
- 前端学习(2328):angular之模板
- [导入]网易娱乐频道也在用风讯CMS
- 事件处理程序中event参数的传递
- eclipse终止端处的加载主类错误
- IronPython 小试牛角
- JZOJ7月18日提高组T1 Family
- 宝尚简讯-短期震荡在蓄势
- 链表在java中的应用_Java链表
- SEO独家揭秘:影响网站降权被K的七项因素
- c语言赋值运算符大全,C语言基础学习运算符-赋值运算符(示例代码)
- [线性代数]n维向量(秦静老师主讲)
- C 程序设计语言——第七章练习题
- AI智能抠图工具--头发丝都可见
- 方舟大洋洲服务器稳定嘛,方舟生存进化最新版182.0更新内容翻译一览
热门文章
- Graph Search就是语义搜索
- 当前几个主要的Lucene中文分词器的比较
- NHibernate.ADOException: cannot open connection
- arm linux 内核启动,Linux(ARM)内核启动地址
- asp.net mvc4三层架构搭建
- 隐马尔可夫(HMM)
- Linux开关机命令:shutdown,reboot,halt,init之间的区别
- 将十六进制的字符串转换成整数
- [召集] .NET Framework基本类库中的设计模式
- 人工智能是如何改变IT运维和DevOps的?