• 算法总结之 反转单向和双向链表


    分别实现反转单向和双向链表的函数

    看代码:

    package TT;
    
    public class Test88 {
    
        public class Node{
             public int value;
             public Node next;
             public Node(int data){
                  this.value = data;
             }
        }
        
        public Node reverseList(Node head){
              Node pre = null;
              Node next = null;
              while(head!=null){
                  next = head.next;
                  head.next = pre;
                  pre = head;
                  head = next;
              }
              return pre;
        }
    
    }

     可以用栈实现:

      

    class Node {
        int value;
        Node next;
    
        public Node(int value) {
            this.value = value;
        }
    }
    public class Test19 {
    
        public static Node getReverseList(Node node) {
            Stack<Node> stack = new Stack<>();
            while (node != null) {
                Node now = node;
                stack.push(now);
                node=node.next;
            }
           Node pre = stack.pop();
           Node result = pre;
           Node next = null;
            while (!stack.isEmpty()) {
                next = stack.pop();
                pre.next=next;
                pre=next;
            }
            next.next=null;
            return result;
        }
        public static void main(String[] args) {
            Node node1 = new Node(1);
            Node node2 = new Node(2);
            Node node3 = new Node(3);
            Node node4 = new Node(4);
    
            node1.next=node2;
            node2.next=node3;
            node3.next=node4;
            node4.next=null;
    
            Node resultNode = getReverseList(node1);
            while (resultNode !=null){
                System.out.println(resultNode.value);
                resultNode=resultNode.next;
            }
        } 
    
    }

    反向双向链表

    package TT;
    
    
    
    import TT.Test86.DoubleNode;
    
    public class Test89 {
    
        public DoubleNode{
            public int  value;
            public DoubleNode last;
            public DoubleNode pre;
            public DoubleNode(int data){
                this.value = data;
            }
        }
        
        public DoubleNode reverseList(DoubleNode head){
            DoubleNode pre = null;
            DoubleNode next = null;
            while(head!=null){
                next = head.next;
                head.next = pre;
                head.last = next;
                pre = head;
                head = next;
                
                
            }
            return pre;
        }
            
    }

     调节指针的算法:

    class Node {
        int value;
        Node next;
    
        public Node(int value) {
            this.value = value;
        }
    }
    public class Test19 {
    
        public static Node getReverseList(Node node) {
            Node last = null;
            Node pre = node;
            Node next = node.next;
            while (pre.next != null){
               pre.next=last;
               last=pre;
               pre= next ;
               next=next.next;
            }
            pre.next=last;
            return  pre;
        }
        public static void main(String[] args) {
            Node node1 = new Node(1);
            Node node2 = new Node(2);
            Node node3 = new Node(3);
            Node node4 = new Node(4);
    
            node1.next=node2;
            node2.next=node3;
            node3.next=node4;
            node4.next=null;
    
            Node resultNode = getReverseList(node1);
            while (resultNode !=null){
                System.out.println(resultNode.value);
                resultNode=resultNode.next;
            }
        } 
    
    }
  • 相关阅读:
    js原生碰撞检测
    基于栈的指令集与基于寄存器的指令集
    偏向锁,轻量级锁
    java 内存模型
    JVM即时编译器
    动态分配
    静态分配
    栈帧笔记
    类加载器
    类加载过程
  • 原文地址:https://www.cnblogs.com/toov5/p/7499225.html
Copyright © 2020-2023  润新知