问题:
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2]
输出:[2,1]
示例 3:
输入:head = []
输出:[]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-linked-list
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
递归:对当前递归的每一个元素,做转换将他的下一个节点指向他的前一个节点。
双指针:每次交换前保存当前遍历节点的下一个节点,然后改变当前节点指向。
解法:
解法一:递归
pre为前一个节点,cur为当前节点,先保存当前节点的下一个节点,然后进行交换,再递归的改变每个节点的指向。
/**
* 递归
* @param pre
* @param cur
* @return
*/
public ListNode reverse(ListNode pre , ListNode cur){
if (cur==null)return pre;
ListNode temp = cur.next;
cur.next=pre;
return reverse(cur,temp);
}
public ListNode reverseList01(ListNode head) {
return reverse(null,head);
}
方法二:双指针
pre 为前一个节点,temp用来保存当前节点的下一个节点,然后改变当前节点的指向,再将我们保存的下一个节点赋给head循环遍历;
/**
* 双指针交换
* @param head
* @return
*/
public ListNode reverseList02(ListNode head) {
ListNode pre = null;
ListNode temp = null;
while (head!=null){
temp = head.next;
head.next=pre;
pre=head;
head=temp;
}
return pre;
}