zoukankan      html  css  js  c++  java
  • 面试题1——反转单链表

    题目

    反转一个单链表

    实现

    1.(递归法)利用递归思想,从头结点递归遍历到最后一个结点,递归返回最后一个结点并修改指针,使指针指向前一个结点。

    2.(移动指针)定义当前结点指针cur,前一个结点指针pre,循环迭代,计算下一个结点指针,每次将当前结点指针反转指向前一个结点。

    定义结点:

    Node.java

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

    NodeReverse.java

    import java.util.Stack;
    
    public class NodeReverse {
        //===================单链表反转==================
        //反转,递归思想
        public static Node reverseRecur(Node node) {
            if (node == null || node.next == null) {
                return node;
            } else {
                Node nn = reverseRecur(node.next);
                //下一个节点的指针指向上一个节点
                node.next.next = node;
                //断掉当前节点指向下一节点的指针
                node.next = null;
                return nn;
            }
        }
    
        //反转,移动指针
        public static Node reverseMovePoint(Node node) {
            //前一个节点指针
            Node pre = null;
            //当前节点指针
            Node cur = node;
            while (cur != null) {
                //当前节点的下一个节点
                Node nextNode = cur.next;
                //当前节点指向下一个节点的指针反转,指向前一个节点
                cur.next = pre;
                //当前节点变前一个(pre)节点,前一个节点的指针指向当前节点
                pre = cur;
                //下一个节点变当前(cur)节点,当前节点指针指向下一个节点
                cur = nextNode;
            }
            return pre;
        }
    
        //==================倒着打印链表=====================
        //递归倒着打印
        public static void printTailRec(Node node){
            if (node.next ==null){
                System.out.print(node.value + " ");
                return;
            } else {
                printTailRec(node.next);
            }
            System.out.print(node.value + " ");
        }
    
        //遍历,用栈存储,倒着打印
        public static void printTailStack(Node node){
            Stack<Node> stack = new Stack<Node>();
            if (node == null){
                System.out.println("已经为null");
                return;
            }else {
                while (node != null){
                    stack.push(node);
                    node = node.next;
                }
                while (!stack.isEmpty()){
                    System.out.print(stack.pop().value + " ");
                }
            }
        }
    
        //打印单链表
        public static void printLinked(Node head) {
            Node tmp = head;
            while (true) {
                System.out.print(tmp.value + " ");
                if (tmp.next == null)
                    break;
                else
                    tmp = tmp.next;
            }
        }
    
        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;
    
            System.out.println("反转前打印==");
            printLinked(node1);
            System.out.println("");
    
            Node n = reverseRecur(node1);
            System.out.println("反转后打印==");
            printLinked(n);
            System.out.println("");
    
            Node nn = reverseMovePoint(n);
            System.out.println("再次反转后打印==");
            printLinked(nn);
            System.out.println("");
    
            //倒着打印链表
            System.out.println("倒着打印链表");
            printTailRec(node1);
            System.out.println("");
            printTailStack(node1);
    
        }
    }

    输出结果:

    反转前打印==
    1 2 3 4
    反转后打印==
    4 3 2 1
    再次反转后打印==
    1 2 3 4
    倒着打印链表
    4 3 2 1
    4 3 2 1

  • 相关阅读:
    5.9上午
    5.4下午
    5.4上午
    5.2上午
    4.19下午
    4.18上午
    4.17下午
    4.17上午
    4.12下午
    4.13下午
  • 原文地址:https://www.cnblogs.com/limaosheng/p/10401573.html
Copyright © 2011-2022 走看看