执行过程
初始化:prev=None(前一个节点),curr=原来的头节点
before
prev=None
curr='head'
高亮: {"objects": ["ptr:prev", "ptr:curr"]}
💡 从链表头部开始,一个一个反转箭头方向。
🧠 反转链表就像把一排箭头全部反过来。prev 指向已经反转好的部分,curr 指向正在处理的节点。
保存 curr.next 到 next_temp(curr.val=1,next_temp=2)
before
curr.val=1
curr.next=2
next_temp=2
高亮: {"objects": ["ptr:curr", "ptr:next_temp"]}
💡 必须先把 curr.next 存下来,因为下一步要断开这个箭头。不保存的话,后面的链表就丢了。
反转箭头:curr.next 现在指向 prev(curr.val=1 → prev=None)
before
curr.val=1
prev=None
高亮: {"objects": ["ptr:curr", "ptr:prev"], "edge": "curr->prev"}
💡 核心动作:把当前节点的 next 指针掉头,从指向下一个变成指向前一个。这就是'反转'。
移动指针:prev 前进到 curr,curr 前进到 next_temp(prev.val=1)
高亮: {"objects": ["ptr:prev", "ptr:curr"]}
💡 处理完当前节点后,prev 和 curr 都向前移动一步,准备处理下一个节点。
保存 curr.next 到 next_temp(curr.val=2,next_temp=3)
before
curr.val=2
curr.next=3
next_temp=3
高亮: {"objects": ["ptr:curr", "ptr:next_temp"]}
💡 必须先把 curr.next 存下来,因为下一步要断开这个箭头。不保存的话,后面的链表就丢了。
反转箭头:curr.next 现在指向 prev(curr.val=2 → prev=1)
高亮: {"objects": ["ptr:curr", "ptr:prev"], "edge": "curr->prev"}
💡 核心动作:把当前节点的 next 指针掉头,从指向下一个变成指向前一个。这就是'反转'。
移动指针:prev 前进到 curr,curr 前进到 next_temp(prev.val=2)
高亮: {"objects": ["ptr:prev", "ptr:curr"]}
💡 处理完当前节点后,prev 和 curr 都向前移动一步,准备处理下一个节点。
保存 curr.next 到 next_temp(curr.val=3,next_temp=4)
before
curr.val=3
curr.next=4
next_temp=4
高亮: {"objects": ["ptr:curr", "ptr:next_temp"]}
💡 必须先把 curr.next 存下来,因为下一步要断开这个箭头。不保存的话,后面的链表就丢了。
反转箭头:curr.next 现在指向 prev(curr.val=3 → prev=2)
高亮: {"objects": ["ptr:curr", "ptr:prev"], "edge": "curr->prev"}
💡 核心动作:把当前节点的 next 指针掉头,从指向下一个变成指向前一个。这就是'反转'。
移动指针:prev 前进到 curr,curr 前进到 next_temp(prev.val=3)
高亮: {"objects": ["ptr:prev", "ptr:curr"]}
💡 处理完当前节点后,prev 和 curr 都向前移动一步,准备处理下一个节点。
保存 curr.next 到 next_temp(curr.val=4,next_temp=5)
before
curr.val=4
curr.next=5
next_temp=5
高亮: {"objects": ["ptr:curr", "ptr:next_temp"]}
💡 必须先把 curr.next 存下来,因为下一步要断开这个箭头。不保存的话,后面的链表就丢了。
反转箭头:curr.next 现在指向 prev(curr.val=4 → prev=3)
高亮: {"objects": ["ptr:curr", "ptr:prev"], "edge": "curr->prev"}
💡 核心动作:把当前节点的 next 指针掉头,从指向下一个变成指向前一个。这就是'反转'。
移动指针:prev 前进到 curr,curr 前进到 next_temp(prev.val=4)
高亮: {"objects": ["ptr:prev", "ptr:curr"]}
💡 处理完当前节点后,prev 和 curr 都向前移动一步,准备处理下一个节点。
保存 curr.next 到 next_temp(curr.val=5,next_temp=None)
before
curr.val=5
curr.next=None
next_temp=None
高亮: {"objects": ["ptr:curr", "ptr:next_temp"]}
💡 必须先把 curr.next 存下来,因为下一步要断开这个箭头。不保存的话,后面的链表就丢了。
反转箭头:curr.next 现在指向 prev(curr.val=5 → prev=4)
高亮: {"objects": ["ptr:curr", "ptr:prev"], "edge": "curr->prev"}
💡 核心动作:把当前节点的 next 指针掉头,从指向下一个变成指向前一个。这就是'反转'。
移动指针:prev 前进到 curr,curr 前进到 next_temp(prev.val=5)
高亮: {"objects": ["ptr:prev", "ptr:curr"]}
💡 处理完当前节点后,prev 和 curr 都向前移动一步,准备处理下一个节点。
循环结束(curr=None),prev 就是新的头节点(prev.val=5)。返回 prev。
🧠 当 curr 走到 None 时,说明原来的链表末尾已经到了。prev 此时指向的就是反转后的新头部。