zoukankan      html  css  js  c++  java
  • 从尾到头打印链表

    问题

    牛客上面有这样一个题,输入如下链表

    public class ListNode {
        int val;
        ListNode next = null;
        ListNode(int val) {
            this.val = val;
        }
    }
    // 完成下面方法
    ArrayList<Integer> printListFromTailToHead(ListNode listNode){}
    

    然后让你从尾到头输出一个ArrayList

    题解

    遍历元素添加到list的第一位
    使用ArrayList的 add(int index, E element)方法,遍历一遍node 放进去
    这样过后 arraylist就是一个反链表。
    这个方法 看是简单,可是效率确实异常底下,原因在这个add方法里面,
    添加到第一位,会将第一位之后的所有数据往后移动一位。

    我思考了下,可以使用 首位置换法 也是受到二分查找方法的启发,想出来的方法。
    思想就是:将第一位和最后一位交换位置,然后第二位和倒数第二位,以此类推就能将整个链表反转。

    public ArrayList<Integer> printListFromTailToHead(ListNode listNode) {
        if(listNode == null){
            return new ArrayList<>();
        }
        ArrayList<Integer> arrayList = new ArrayList<>();
        arrayList.add(listNode.val);
        while (listNode.next != null) {
            listNode = listNode.next;
            arrayList.add(listNode.val);
        }
    
        int l = 0, r = arrayList.size() - 1, m = (r + l) / 2;
        while (l <= m) {
            int a = arrayList.get(l);
            arrayList.set(l, arrayList.get(r));
            arrayList.set(r, a);
            l++;
            r--;
        }
    
        return arrayList;
    }
    
  • 相关阅读:
    内部类
    多重继承关系初始化顺序及初始化
    String
    Error
    算法:插入排序
    算法:冒泡排序
    算法:选择排序
    注册Activity
    java变量的作用域和基本数据类型转换
    java数据类型
  • 原文地址:https://www.cnblogs.com/paper-man/p/13284602.html
Copyright © 2011-2022 走看看