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
题解
这是一道经典的指针反转问题,一般采用前后指针去辅助解题
- pre,保存前一个节点
- now,保存当前节点
- next,保存下一个节点
具体过程,主要为三步,
- 第一,先通过next保存now的下一个节点,防止断链;
- 第二,改变now的指向,翻转指针;
- 第三,更新pre为now,now为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;//pre节点
ListNode now = head;//now节点
ListNode next;//next节点
while(now != null){//now不为空
next = now.next;//保存now的下一个节点,防止断链
now.next = pre;//翻转指针
pre = now;//移动pre
now = next;//移动now
}
return pre;
}
}