zoukankan      html  css  js  c++  java
  • 让我们来写个算法吧,(1)翻转单链表

    作为面试中最最最常考的链表题之一,翻转单链表。有以下两种解法:

    例: 输入 1->2->3->4  输出 4->3->2->1

      Node类定义如下

    class Node {
    
        int value;
    
        Node next;
    
        public Node(int value, Node next) {
            this.value = value;
            this.next = next;
        }

    1.遍历法

      此方法根据链表遍历,通过拆分,刷新节点来达到翻转单链表的功能。

      

      草稿过程 

        第一次遍历 主链表 2->3->4   输出链表 1

        第二次遍历 主链表3->4         输出链表 2->1  

        第三次遍历 主链表 4        输出链表 3->2->1

        第四次遍历 主链表           输出链表 4->3->2->1

      分析过程完了,我们上代码咯:

      

    public static Node reverseNode(Node node) {
       // 因为node节点会发生变化,所以用于存储node节点    
      Node tmp = null;
    Node result =null;

      while(node!=null){
        // 先存起来
        node.next = tmp;
        
        node.next = result;

        result = node;
        
        //上面两步是为了保存每次的断开节点,第一次遍历,result =null; 1.next =null; result =1 ;
        //第二次遍历,result =1; 2.next =1; result =2->1 ;
        node = tmp;
      } return result; }

    2.递归法 

      主要是通过程序栈保留的案发现场进行节点的断开和重组

      

      

        public static Node reverseNode(Node node) {
            
            if(node==null || node.next == null) {
                return node;
            }
            //案发现场
            Node temp = node.next;
            Node returnNode = reverseNode(node.next);
            // 从当前节点断开
            node.next = null;
            // 用案发现场的节点指向当前节点
            temp.next = node;
            
            return returnNode;
    
        }
  • 相关阅读:
    英语:漏屋-英语学习的真实方法及误区分析(转)
    TSP(旅行者问题)——动态规划详解(转)
    用二进制位表示状态,从而将状态压缩到一个整数里表示
    Android的CursorLoader用法小结
    RMQ问题ST算法 (还需要进一步完善)
    离散化
    反转(开关问题) POJ 3276
    关于序列中某个元素位置的查找
    快速幂运算
    Docker学习2-虚拟化
  • 原文地址:https://www.cnblogs.com/leaveast/p/12289328.html
Copyright © 2011-2022 走看看