面试题16:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。
Basic
三指针向前推进法(自创词汇方便记忆)
思路分析
由于反向链表每个节点时,需要切断链表,此时就需要切口前后两个Node holder: pre 和 next
可以想象成一根绳子切成两段,分别需要两个人来牵住绳头
左边绳子需要牵住右端(逆序)
右边绳子只需有人保住后面那段链表即可,因此右边绳子牵住左端。
如果不找这两个人来牵住各自两边的绳头,切断后的两段链表就会丢失,只要没有Holder,就被回收
同时需要从前往后遍历下去,需要多一个移动指针 Node cur 收割者,从头结点head开始收割
代码实现
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head == null) {
return null;
}
if(head.next == null) {
return head;
}
ListNode pre = null;
ListNode next = null;
ListNode cur = head;
while(cur != null) {
next = cur.next;//1、让 next 小哥提前握住即将要切断的右边绳子的绳头
cur.next = pre;//2、把 cur 之后的绳子切断,cur 的牵住的人从next哥换成pre妹子,此时完成左边绳子的逆序
pre = cur;//3、善后:为了下一步继续遍历下去,需要让 pre 往前右走一步,cur 把他握住的节点移交给pre妹子
cur = next;//4、善后:左边绳子的逆序完全执行完毕,cur 小哥往右走一步,和 next 一起牵住右段绳子的绳头
//此时 cur 收割者又准备收割下一个节点了!
}
return pre;//注意,pre 就相当于左边逆序好的链表头了
}
}
