目录
- 双指针
- 递归
题目来源
206. 反转链表
双指针
定义两个指针: pre 和 cur;pre 在前 cur 在后。
每次让 cur 的 next 指向 pre,实现一次局部反转
局部反转完成之后,pre 和 cur 同时往前移动一个位置
循环上述过程,直至 cur 到达链表尾部
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null){
return null;
}
ListNode pre = null;
ListNode cur = head;
while(cur != null){
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}
递归
输入一个节点 head,将「以 head 为起点」的链表反转,并返回反转之后的头结点。
那么输入 reverse(head.next) 后,会在这里进行递归:
ListNode last = reverse(head.next);
这个 reverse(head.next) 执行完成后,整个链表就成了这样:
reverse 函数会返回反转之后的头结点,我们用变量 last 接收了。
现在再来看下面的代码:
head.next.next = head;
接下来
head.next = null;
return last;
递归函数要有 base case,也就是这句:
if (head.next == null) return head;
意思是如果链表只有一个节点的时候反转也是它自己,直接返回即可。
代码实现
class Solution {
public ListNode reverseList(ListNode head) {
if(head == null){
return null;
}
if(head.next == null){
return head;
}
ListNode last = reverseList(head.next);
head.next.next = head;
head.next = null;
return last;
}
}