2025.8.27链表_链表逆置
链表中的指针只是用来标记,具体连接方式,是按照node.next链接。
JAVA中头节点存东西,不是空的。
核心原理:Java 的参数传递是"值传递",但对象引用是"值传递引用"
也就是传过来了ListNode head。head=head.next不会改变,因为head存在栈内存里面。但是如果改变head.val值或者改变head.next值就会改变它原本的东西了。因为.val和.next存在堆内存里。
2. 内存模型可视化
调用前:
text
栈内存 (Stack) 堆内存 (Heap) ┌─────────────┐ ┌─────────────┐ │ main方法栈帧 │ │ │ │ head: 0x100 │──────→│ ListNode(1) │ │ │ │ val = 1 │ │ │ │ next = null │ └─────────────┘ └─────────────┘调用 method(head) 时:
text
栈内存 (Stack) 堆内存 (Heap) ┌─────────────┐ ┌─────────────┐ │ main方法栈帧 │ │ │ │ head: 0x100 │──────→│ ListNode(1) │ │ │ │ val = 1 │ ├─────────────┤ │ next = null │ │ method栈帧 │ └─────────────┘ │ head: 0x100 │───────┘ │ │ └─────────────┘执行 head = head.next 后:
text
栈内存 (Stack) 堆内存 (Heap) ┌─────────────┐ ┌─────────────┐ │ main方法栈帧 │ │ │ │ head: 0x100 │──────→│ ListNode(1) │ │ │ │ val = 1 │ ├─────────────┤ │ next = null │ │ method栈帧 │ └─────────────┘ │ head: null │ // 只改变了局部变量! │ │ └─────────────┘3. 关键区别:修改引用 vs 修改对象
java
void method(ListNode head) {// 情况1:修改引用(不影响外部)head = head.next; // 只改变栈内存中局部变量的值// 情况2:修改对象(影响外部)head.val = 100; // 改变堆内存中对象的内容head.next = null; // 改变堆内存中对象的指针 }
List<Integer> vals = new ArrayList<Integer>();
这个List是个接口,后面的ArrayList是具体的实现类
ArrayList<Integer> list = new ArrayList<Integer>();
list.add("apple");//add普通用法
list.add("orange");
list.add(1,"mango")//add带索引用法
ArrayList<Integer> fruits = new ArrayList<Integer>();
fruits.add("watermellon");
fruits.add("peach");
list.addAll(fruits);//addAll用法
String f = list.get(0);//get用法
list.remove(1);//删除索引为1的元素//ArrayList没有length属性,但是可以通过list.size()获取
int size = list.size();