题目
题意:反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
思路
●双指针法/迭代
●递归法
双指针法(简单模拟)
- 定义两个指针,
cur
指向头结点,pre
初始化为空 - 然后开始反转,先保存
cur->next
,然后将cur的next指针
指向pre
,这样就完成第一个节点的反转了 - 接着
cur
和pre
后移继续迭代进行,直到cur
指向null
反转结束,最后return pre
指针即可
//双指针法,画个图很好理解
class Solution{
public ListNode reverseList(ListNode head){
ListNode pre = null;
ListNode cur = head;
ListNode temp = null;
while(cur != null){
temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;//返回pre是因为cur指向null的时候,pre正好指向为头结点
}
}
递归法
递归和双指针法是一样的逻辑,同样是当cur
为空的时候循环结束,不断将cur
指向pre
的过程。
//递归
class Solution{
public ListNode reverseList(ListNode head){
return reverse(null,head);
}
private ListNode reverse(ListNode pre, ListNode cur){
if(cur == null){
return pre;//返回pre是因为cur指向null的时候,pre正好指向为头结点
}
ListNode temp = null;
temp = cur.next;
cur.next = pre;
return reverse(cur,temp);//更新pre,cur位置,对应括号里的参数顺序,相当于pre = cur;cur = temp;
}
}
//从后往前递归,从后往前翻转指针(比较推荐)
class Solution{
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
head.next = null;
return last;
}
}