题目:
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例2
输入:head = [1,2]
输出:[2,1]
示例3
输入:head = []
输出:[]
思路:
- 双指针法
创建一个临时变量来存储head结点的next结点,重点在于改变各个结点的next指针
实现:
class Solution {
public ListNode reverseList(ListNode head) {
//1.创建临时变量来存储head.next结点
ListNode temp = null;
//2.创建两个结点用于 逐个改动结点的next指针指向
//首先先让head的next指向pre,也就是空,
//然后再让下一个节点指向 head,依此类推
ListNode pre = null;
ListNode cur = head;
//cur逐渐向后移动,最后cur指向null,因此用cur作为循环判断条件;
while(cur != null){
//移动过程;
temp = cur.next;
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;
}
}
- 递归法
一次只反转一个next指针
实现:
class Solution {
public ListNode reverseList(ListNode head) {
return reverse(null,head);
}
public ListNode reverse(ListNode pre,ListNode cur){
if(cur == null){
return cur;
}
ListNode temp = null;
temp = cur.next;
cur.next = pre;
return reverse(cur,temp);
}
}