链表-倒序排列鏈表

剑指 Offer 06. 从尾到头打印链表

38

输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。

示例 1:

输入:head = [1,3,2]
输出:[2,3,1]

限制:

0 <= 链表长度 <= 10000`

这题我第一次看有点懵,看了很久还是有点懵。。。。。
之后看了解答,大致的思路是:
1.首先要认识到链表只能从前至后依次访问每个节点,不同与数组可以随便得到某个位置的元素;
2.很多时候,我们都知道栈的特点是“先进后出”,但却不知道怎么用,那么这道题就是一个很好的例子了,从尾到头反过来返回每个节点的值,我们便可以利用栈的特点,先讲链表的各个节点压栈,然后出栈,就ojbk了

/**
 * 这是对ListNode这个类一个简单的说明
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public int[] reversePrint(ListNode head) {
    	//首先是用到了集合框架的LinkedList,并且指定该容器只能往里面入Integer类型的数据
        LinkedList<Integer> stack = new LinkedList<Integer>();
        while(head != null) {
        	//将各个节点数据依次添加到栈的最后一个元素,每次添加,之前添加的节点数据便会往前挪一步,个人对这里的head.val不是很理解,
        	//知道是和上面的构造方法传入参数有关,但我感觉我好像少了一个知识点,联系不上来,希望有好心人可以帮忙解答一下
            stack.addLast(head.val);
            head = head.next;
        }
        //之后便是把栈的大小作为我们要返回的数组res的大小,
        //然后依次把栈的最后一个元素取到res里面去
        int[] res = new int[stack.size()];
        for(int i = 0; i < res.length; i++)
            res[i] = stack.removeLast();
    return res;
    }
}

作者:jyd
链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/solution/mian-shi-ti-06-cong-wei-dao-tou-da-yin-lian-biao-d/

//上面的方法是用到LinkedList的方法,可以实现与栈相同的操作,而下面的解法则是直接用栈了
```java
class Solution {
    public int[] reversePrint(ListNode head) {
        Stack<ListNode> stack = new Stack<ListNode>();
        ListNode temp = head;
        while (temp != null) {
            stack.push(temp);
            temp = temp.next;
        }
        int size = stack.size();
        int[] print = new int[size];
        for (int i = 0; i < size; i++) {
            print[i] = stack.pop().val;
        }
        return print;
    }
}

//再补充一种方法,是根据链表的内部结构直接写出来的
class Solution {
    public int[] reversePrint(ListNode head) {
        int number = 0;
        ListNode temp = head;
        while(temp!=null){
            number++;
            temp = temp.next;
        }
        int[] num = new int[number];
        ListNode temp1 = head;
        int var = number-1;
        for(int i = var; i >= 0; i--){
            num[i] = temp1.val;
            temp1 = temp1.next;
        }
        return num;
    }
}
/**
 * 这是对ListNode这个类一个简单的说明
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
 对ListNode的解释,一个类型为ListNode的节点,有类型为int的val,也有类型为ListNode的next,最后的一种方法是用了该链表的特性而写出来的,当链表的某个节点为null时,说明该节点为该链表的最后一个节点,以此求出链表有多少个节点,之后是倒序排列,比较简单

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/cong-wei-dao-tou-da-yin-lian-biao-lcof/solution/mian-shi-ti-06-cong-wei-dao-tou-da-yin-lian-biao-b/


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值