链接
牛客:反转链表
LeetCode:剑指 Offer 24. 反转链表 / 206. 反转链表
思路
非常经典的面试题,也是链表部分的基础题目
可以分为递归和非递归两种方法,非递归采用头插法。
代码
非递归双指针,最常见的一种
class Solution {
public ListNode reverseList(ListNode head) {
ListNode cur = head, pre = null;
while(cur!=null){
ListNode temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}
非递归头插法,需要额外申请一个节点指向头指针
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode virt = new ListNode(0);
virt.next = head;
ListNode p = head;
while(p.next != null){
ListNode q = p.next;
p.next = q.next;
q.next = virt.next;
virt.next = q;
}
return virt.next;
}
}
递归
public class Solution {
public ListNode ReverseList(ListNode head) {
if(head == null || head.next == null){
return head;
}
ListNode pre = ReverseList(head.next);
head.next.next = head;
head.next = null;
return pre;
}
}