牛客网
程序执行逻辑: 1->2->3->4->5进去方法中,首先不满足list.next != null 将listNode赋值为 2->3->4->5,然后将 2->3->4->5的倒序结果赋值给list保存, 2->3->4->5进去方法… 3->4->5… 4->5… 当5进入方法时由于listNode.next == null 所以list.add(5), 执行return list,结果赋值给了 4->5 倒序的方法,然后执行list.add(4),list的结果变为了5,4 … 由此实现了单链表的倒序。
头插法:由于链表的结构 只有val和next 两个属性,所以可以构造一个虚拟的节点,然后主链表遍历的时候将每次的节点赋值给头结点的next eg: 1->2->3->4->5倒序 构造一个虚拟节点-1 遍历1->2->3->4->5 将当前节点赋值给头结点的next -1->1 2->3->4->5 然后继续遍历 2->3->4->5 虚拟链表变为了 -1->2->1 主链表 3->4->5
直到主链表为null时遍历完毕。
import java.util.ArrayList; public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode{ // 头插法实现 首先创建一个虚拟节点 ArrayList<Integer> list = new ArrayList<>(); ListNode head = new ListNode(-1); while(listNode != null){ ListNode temp = listNode.next; listNode.next = head.next; head.next = listNode; listNode = temp; } head = head.next; while(head != null){ list.add(head.val); head = head.next; } return list; } } 利用栈先进后出的特性: import java.util.ArrayList; import java.util.Stack; public class Solution { public ArrayList<Integer> printListFromTailToHead(ListNode listNode) { ArrayList<Integer> list = new ArrayList<>(); Stack<Integer> stack = new Stack<>(); while (listNode != null) { stack.push(listNode.val); listNode = listNode.next; } while (!stack.isEmpty()) { list.add(stack.pop()); } return list; } }