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是具体的实现类
java 复制代码
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();