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

循环控制-链表反转(与创建链表)相关推荐

  1. Python3 反转一个单链表

    Python3 反转一个单链表 反转一个单链表. 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1-&g ...

  2. 【剑指Offer专题】链表系列:从尾到头打印链表、反转链表、回文链表、合并两个排序的链表(C++和Python实现)...

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 剑指Offer(三):从尾到头打印链表 输入一个链表的头节点,从尾到头反过来返回每 ...

  3. 链表反转相关的题(C++模板)

     目录 反转单链表 反转部分单链表 K个一组反转单链表 K个一组反转单链表(从尾结点开始) 反转单链表 定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点 输入: 1->2- ...

  4. 七十、反转和合并链表、 链表有环的判断

    @Author:Runsen 编程的本质来源于算法,而算法的本质来源于数学,编程只不过将数学题进行代码化. ---- Runsen 最近在重新梳理学算法的知识,本文为链表常见操作复习的总结文章,会讲解 ...

  5. 用JAVA语言创建链表的方法

    链表刚学习时是用c来学习的,那时候对于结构体,指针这些东西实现链表觉得很合适,但想要应用到java上还是有些不同的 这里,我学习下用java来使用链表的方法: 首先,定义节点类 //链表节点 clas ...

  6. 【算法系列之三】单链表反转

    问题: 实现单链表反转 答案: 链表准备 class Node {private int Data;// 数据域private Node Next;// 指针域public Node(int Data ...

  7. C++实现链表逆序打印、链表反转

    //题目:C++实现链表逆序打印.链表反转 // 如何将链表逆序,取决于题目的要求.如果面试官只要求打印,一般不改动链表结构为好,如果要求改变链表的方向,则需要改变结构,再顺序打印. // 方法1:只 ...

  8. 【链表】C++链表反转、链表逆序打印

    转载地址:http://blog.csdn.net/yebanxin/article/details/51942598 题目:C++实现链表逆序打印.链表反转 如何将链表逆序,取决于题目的要求.如果面 ...

  9. 【链表】C++链表反转、链表逆序打印(三)

    题目:C++实现链表逆序打印.链表反转 如何将链表逆序,取决于题目的要求.如果面试官只要求打印,一般不改动链表结构为好,如果要求改变链表的方向,则需要改变结构,再顺序打印. 方法1:只逆序打印,不改变 ...

  10. Java单向链表反转

    要求 给出单链表的头节点 head ,要求反转链表,并返回反转后的链表. 实现原理 单向链表反转就是将链表的指针方向改变.由于单链表没有指向前一个结点的指针,所以,我们定义一个指向前一个节点的指针pr ...

最新文章

  1. matlab字母随机排列,matlab_一组数据元素随机排列
  2. gnome Nautilus cannot handle computer locations
  3. awstats 安装与配置
  4. PE结构绑定导入实现
  5. java图像处理之图像融合
  6. Python FastApi:post文件与数据/本地端测试
  7. 前端学习(2328):angular之模板
  8. [导入]网易娱乐频道也在用风讯CMS
  9. 事件处理程序中event参数的传递
  10. eclipse终止端处的加载主类错误
  11. IronPython 小试牛角
  12. JZOJ7月18日提高组T1 Family
  13. 宝尚简讯-短期震荡在蓄势
  14. 链表在java中的应用_Java链表
  15. SEO独家揭秘:影响网站降权被K的七项因素
  16. c语言赋值运算符大全,C语言基础学习运算符-赋值运算符(示例代码)
  17. [线性代数]n维向量(秦静老师主讲)
  18. C 程序设计语言——第七章练习题
  19. AI智能抠图工具--头发丝都可见
  20. 方舟大洋洲服务器稳定嘛,方舟生存进化最新版182.0更新内容翻译一览

热门文章

  1. Graph Search就是语义搜索
  2. 当前几个主要的Lucene中文分词器的比较
  3. NHibernate.ADOException: cannot open connection
  4. arm linux 内核启动,Linux(ARM)内核启动地址
  5. asp.net mvc4三层架构搭建
  6. 隐马尔可夫(HMM)
  7. Linux开关机命令:shutdown,reboot,halt,init之间的区别
  8. 将十六进制的字符串转换成整数
  9. [召集] .NET Framework基本类库中的设计模式
  10. 人工智能是如何改变IT运维和DevOps的?