• 单链表反转总结篇


    单链表反转总结篇

    转自https://www.cnblogs.com/byrhuangqiang/p/4311336.html

    单链表的反转是常见的面试题目。本文总结了2种方法。

    1 定义

    单链表node的数据结构定义如下:

    复制代码
    class ListNode {
        int val;
        ListNode next;
        ListNode(int x) {
            val = x;
            next = null;
        }
    }
    复制代码

    2 方法1:就地反转法

    2.1 思路

    把当前链表的下一个节点pCur插入到头结点dummy的下一个节点中,就地反转。

    dummy->1->2->3->4->5的就地反转过程:

    dummy->2->1->3->4->5
    dummy->3->2->1->4->5
    dummy->4>-3->2->1->5
    dummy->5->4->3->2->1

    2.2 解释

    1初始状态

    2 过程

    pCur是需要反转的节点。

    1. prev连接下一次需要反转的节点
    2. 反转节点pCur
    3. 纠正头结点dummy的指向
    4. pCur指向下一次要反转的节点

    伪代码

    1 prev.next = pCur.next;
    2 pCur.next = dummy.next;
    3 dummy.next = pCur;
    4 pCur = prev.next;

    3 循环条件

    pCur is not null

    2.3 代码

    复制代码
     1     // 1.就地反转法
     2     public ListNode reverseList1(ListNode head) {
     3         if (head == null)
     4             return head;
     5         ListNode dummy = new ListNode(-1);
     6         dummy.next = head;
     7         ListNode prev = dummy.next;
     8         ListNode pCur = prev.next;
     9         while (pCur != null) {
    10             prev.next = pCur.next;
    11             pCur.next = dummy.next;
    12             dummy.next = pCur;
    13             pCur = prev.next;
    14         }
    15         return dummy.next;
    16     }
    复制代码

    2.4 总结

    • 1个头结点,2个指针,4行代码
    • 注意初始状态和结束状态,体会中间的图解过程。

    3 方法2:新建链表,头节点插入法

    3.1 思路

    新建一个头结点,遍历原链表,把每个节点用头结点插入到新建链表中。最后,新建的链表就是反转后的链表。

    3.2 解释

    1 初始状态

    2 过程

    pCur是要插入到新链表的节点。

    pNex是临时保存的pCur的next。

    1. pNex保存下一次要插入的节点
    2. 把pCur插入到dummy中
    3. 纠正头结点dummy的指向
    4. pCur指向下一次要插入的节点

    伪代码

    1 pNex = pCur.next
    2 pCur.next = dummy.next
    3 dummy.next = pCur
    4 pCur = pNex

    3 循环条件

    pCur is not null

    3.3 代码

    复制代码
     1     // 2.新建链表,头节点插入法
     2     public ListNode reverseList2(ListNode head) {
     3         ListNode dummy = new ListNode(-1);
     4         ListNode pCur = head;
     5         while (pCur != null) {
     6             ListNode pNex = pCur.next;
     7             pCur.next = dummy.next;
     8             dummy.next = pCur;
     9             pCur = pNex;
    10         }
    11         return dummy.next;
    12     }
    复制代码

    3.4 总结

    • 1个头结点,2个指针(包含一个临时保存节点的pNex),4行代码
    • 注意初始状态和结束状态,体会中间的图解过程。
     
  • 相关阅读:
    skywalking简介
    .Net Core微服务——Consul(4):搭建集群
    .Net Core微服务——Consul(3):健康检查
    .Net Core微服务——Consul(2):自动扩展、服务调用
    .Net Core微服务——Consul(1):服务发现
    SpringBoot数据访问之整合Mybatis配置文件
    SpringBoot数据访问之Druid启动器的使用
    SpringBoot数据访问之Druid数据源的自定义使用
    Spring Boot核心技术之Restful映射以及源码的分析
    SpringBoot之yaml语法及静态资源访问
  • 原文地址:https://www.cnblogs.com/mwl523/p/10749144.html
Copyright © 2020-2023  润新知