06. 从尾到头打印链表
思路
说到从尾到头,很容易想到可以用到栈的方式进行处理,那么问题就转化成了如何用辅助栈完成打印链表。可以从链表的头节点开始,依次将每个节点压入栈内,然后依次弹出栈内的元素并存储到数组中。使用到LinkedList的addLast()和removeLast()。
在题目里有一个ListNode对象,ListNode是做什么用的?
public class ListNode{
int val;
ListNode next; //链表指向的下一个值的指针
ListNode(int x){val = x;} //这个方式赋值
}
class Solution {
public int[] reversePrint(ListNode head) {
LinkedList<Integer> stack = new LinkedList<Integer>();
while(head != null){
stack.addLast(head.val);
head = head.next;
}
int[] a = new int[stack.size()];
for(int i = 0; i < a.length; i++){
a[i] = stack.removeLast();
}
return a;
}
}
24. 反转链表
思路
一看到反转就想用栈,但是实际上这道题的思路不是这样的。
反转链表的思路是更改指针的方向,流程是:
- 保存下一节点
- 修改指针方向
- 保存当前节点
- 处理下一节点
class Solution {
public ListNode reverseList(ListNode head) {
ListNode cur = head, pre = null;
while(cur != null) {
ListNode tmp = cur.next;
cur.next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
}