反转链表 (0206_reverse_linked_list)

标签: linked_list · 难度: EASY

输入

head:
1
2
3
4
5
None

执行过程

Step 1 · pointer_init
初始化:prev=None(前一个节点),curr=原来的头节点

before

prev=None curr='head'

after

高亮: {"objects": ["ptr:prev", "ptr:curr"]}
💡 从链表头部开始,一个一个反转箭头方向。
🧠 反转链表就像把一排箭头全部反过来。prev 指向已经反转好的部分,curr 指向正在处理的节点。
Step 2 · save_next
保存 curr.next 到 next_temp(curr.val=1,next_temp=2)

before

curr.val=1 curr.next=2 next_temp=2

after

高亮: {"objects": ["ptr:curr", "ptr:next_temp"]}
💡 必须先把 curr.next 存下来,因为下一步要断开这个箭头。不保存的话,后面的链表就丢了。
Step 3 · link_set
反转箭头:curr.next 现在指向 prev(curr.val=1 → prev=None)

before

curr.val=1 prev=None

after

curr.next=None
高亮: {"objects": ["ptr:curr", "ptr:prev"], "edge": "curr->prev"}
💡 核心动作:把当前节点的 next 指针掉头,从指向下一个变成指向前一个。这就是'反转'。
Step 4 · cursor_move
移动指针:prev 前进到 curr,curr 前进到 next_temp(prev.val=1)

before

prev=1 curr=2

after

prev=1 curr=2
高亮: {"objects": ["ptr:prev", "ptr:curr"]}
💡 处理完当前节点后,prev 和 curr 都向前移动一步,准备处理下一个节点。
Step 5 · save_next
保存 curr.next 到 next_temp(curr.val=2,next_temp=3)

before

curr.val=2 curr.next=3 next_temp=3

after

高亮: {"objects": ["ptr:curr", "ptr:next_temp"]}
💡 必须先把 curr.next 存下来,因为下一步要断开这个箭头。不保存的话,后面的链表就丢了。
Step 6 · link_set
反转箭头:curr.next 现在指向 prev(curr.val=2 → prev=1)

before

curr.val=2 prev=1

after

curr.next=1
高亮: {"objects": ["ptr:curr", "ptr:prev"], "edge": "curr->prev"}
💡 核心动作:把当前节点的 next 指针掉头,从指向下一个变成指向前一个。这就是'反转'。
Step 7 · cursor_move
移动指针:prev 前进到 curr,curr 前进到 next_temp(prev.val=2)

before

prev=2 curr=3

after

prev=2 curr=3
高亮: {"objects": ["ptr:prev", "ptr:curr"]}
💡 处理完当前节点后,prev 和 curr 都向前移动一步,准备处理下一个节点。
Step 8 · save_next
保存 curr.next 到 next_temp(curr.val=3,next_temp=4)

before

curr.val=3 curr.next=4 next_temp=4

after

高亮: {"objects": ["ptr:curr", "ptr:next_temp"]}
💡 必须先把 curr.next 存下来,因为下一步要断开这个箭头。不保存的话,后面的链表就丢了。
Step 9 · link_set
反转箭头:curr.next 现在指向 prev(curr.val=3 → prev=2)

before

curr.val=3 prev=2

after

curr.next=2
高亮: {"objects": ["ptr:curr", "ptr:prev"], "edge": "curr->prev"}
💡 核心动作:把当前节点的 next 指针掉头,从指向下一个变成指向前一个。这就是'反转'。
Step 10 · cursor_move
移动指针:prev 前进到 curr,curr 前进到 next_temp(prev.val=3)

before

prev=3 curr=4

after

prev=3 curr=4
高亮: {"objects": ["ptr:prev", "ptr:curr"]}
💡 处理完当前节点后,prev 和 curr 都向前移动一步,准备处理下一个节点。
Step 11 · save_next
保存 curr.next 到 next_temp(curr.val=4,next_temp=5)

before

curr.val=4 curr.next=5 next_temp=5

after

高亮: {"objects": ["ptr:curr", "ptr:next_temp"]}
💡 必须先把 curr.next 存下来,因为下一步要断开这个箭头。不保存的话,后面的链表就丢了。
Step 12 · link_set
反转箭头:curr.next 现在指向 prev(curr.val=4 → prev=3)

before

curr.val=4 prev=3

after

curr.next=3
高亮: {"objects": ["ptr:curr", "ptr:prev"], "edge": "curr->prev"}
💡 核心动作:把当前节点的 next 指针掉头,从指向下一个变成指向前一个。这就是'反转'。
Step 13 · cursor_move
移动指针:prev 前进到 curr,curr 前进到 next_temp(prev.val=4)

before

prev=4 curr=5

after

prev=4 curr=5
高亮: {"objects": ["ptr:prev", "ptr:curr"]}
💡 处理完当前节点后,prev 和 curr 都向前移动一步,准备处理下一个节点。
Step 14 · save_next
保存 curr.next 到 next_temp(curr.val=5,next_temp=None)

before

curr.val=5 curr.next=None next_temp=None

after

高亮: {"objects": ["ptr:curr", "ptr:next_temp"]}
💡 必须先把 curr.next 存下来,因为下一步要断开这个箭头。不保存的话,后面的链表就丢了。
Step 15 · link_set
反转箭头:curr.next 现在指向 prev(curr.val=5 → prev=4)

before

curr.val=5 prev=4

after

curr.next=4
高亮: {"objects": ["ptr:curr", "ptr:prev"], "edge": "curr->prev"}
💡 核心动作:把当前节点的 next 指针掉头,从指向下一个变成指向前一个。这就是'反转'。
Step 16 · cursor_move
移动指针:prev 前进到 curr,curr 前进到 next_temp(prev.val=5)

before

prev=5 curr=None

after

prev=5 curr=None
高亮: {"objects": ["ptr:prev", "ptr:curr"]}
💡 处理完当前节点后,prev 和 curr 都向前移动一步,准备处理下一个节点。
Step 17 · return
循环结束(curr=None),prev 就是新的头节点(prev.val=5)。返回 prev。

before

after

result=5
🧠 当 curr 走到 None 时,说明原来的链表末尾已经到了。prev 此时指向的就是反转后的新头部。