206. 反转链表
给你单链表的头节点 head
,请你反转链表,并返回反转后的链表。
示例 1:
输入:head = [1,2,3,4,5] 输出:[5,4,3,2,1]
示例 2:
输入:head = [1,2] 输出:[2,1]
示例 3:
输入:head = [] 输出:[]
提示:
- 链表中节点的数目范围是
[0, 5000]
-5000 <= Node.val <= 5000
进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?
双指针思路
首先考虑到头指针需要指向null,所以设置一个pre初始化为null
其次,将当前指针赋为cur,将cur一直后移,直到为空,所以使用while循环
使用next作为临时存储,将cur.next存入next中,然后将cur节点的next换为前置结点。
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
//常规方法(双指针)
ListNode pre = null;
ListNode cur = head;//头赋给cur
while(cur!=null){
ListNode next = cur.next;
cur.next=pre;
pre=cur;
cur=next;
}
return pre;
}
}
递归思路
链表demo:1->2->3
第一轮出栈:3.next==null,返回3
第二轮出栈:2.next==3,2.next.next=2,即3.next=2
所以链表变成:1->2<->3,发现2和3是双向的,所以需要把2->3断开
所以2.next=null,即1->2<-3
第三轮出栈:1.next==2,1.next.next=1,即2.next=1
所以链表变成:1<->2<-3
再把1.next置为null,变成1<-2<-3
实现链表反转
/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode() {}
* ListNode(int val) { this.val = val; }
* ListNode(int val, ListNode next) { this.val = val; this.next = next; }
* }
*/
class Solution {
public ListNode reverseList(ListNode head) {
//拿1->2->3来理解
if(head==null||head.next==null){
return head;
//3的下一个节点为null,所以返回3
}
ListNode tmp = reverseList(head.next);
/*
第一轮出栈:3.next==null,返回3
第二轮出栈:2.next==3,2.next.next=2,即3.next=2
所以链表变成:1->2<->3,发现2和3是双向的,所以需要把2->3断开
所以2.next=null,即1->2<-3
第三轮出栈:1.next==2,1.next.next=1,即2.next=1
所以链表变成:1<->2<-3
再把1.next置为null,变成1<-2<-3
实现链表反转
*/
head.next.next=head;
head.next=null;
return tmp;
}
}