一、题目
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2] 输出:[2,1]
示例 3:
输入:head = [] 输出:[]
二、思路
反转链表属于基础操作,容易想到的就是头插法,但我一开始也没写出来,说明要勤加联系!这里提供 头插法,双指针法,递归(本质是双指针法)三种解法。
三、代码
private static ListNode reverseList(ListNode head) {
//头插法反转链表
/*ListNode newHead = new ListNode();
while (head != null){
ListNode temp = head.next; //这是关键
head.next = newHead.next; //想象当newHead不为空而有好几个节点的时候就能看出是头插法了
newHead.next = head;
head = temp;
}
return newHead.next;*/
//双指针写法
/*ListNode pre = null;
ListNode cur = head;
while(cur != null) {
ListNode temp = cur.next; //防止断链
cur.next = pre;
pre = cur;
cur = temp;
}
return pre;*/
//递归写法
return reverse(null,head);
}
public static ListNode reverse(ListNode pre,ListNode cur) {
if(cur == null) {return pre;}
ListNode temp = cur.next;
cur.next = pre; //反转指针
return reverse(cur,temp); //这里注意:下一次操作 是pre 和cur 一起向后移动一次 然后再反转指针
}
}