LC206. 反转链表
Q:给你单链表的头节点 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
A:思路:该题属于简单题,看到该题可能突然会有的思路是,反向遍历题目给的链表,并逐步创建一个一个新节点,进而生成一个新的符合题意的链表再返回其头结点,这样做虽可以达到目的,但是复杂度却高了。
其实拿到链表类的题,我们最应该想到的是:改变指针。那么有了这一想法,该题目就很容易去解决了,只要我们不断的更改相邻两个节点之间的指针的方向,使其变为反方向即可完成反转链表。
以下是Java代码,仅供参考:
双指针法
public ListNode reverseList(ListNode head) {
if(head == null) return head; // 如果head为null,则不需反转,直接返回即可
ListNode cur = head;
ListNode pre = null;
while(cur != null){
ListNode temp = cur.next; // 用于存储cur的下一个节点,因为cur的next指针要更改方向了
cur.next = pre; // 更改指针方向
pre = cur; // pre前移,指向cur
cur = temp; // cur前移,指向temp
}
}
递归法
public ListNode reverseList(ListNode head) {
if(head == null) return head;
return reverse(null, head);
}
// 递归函数
public ListNode reverse(ListNode pre, ListNode cur){
if(cur == null) return pre; // 递归终止条件,当cur == null时,返回pre
ListNode temp = cur.next; // 因为要改变指针方向,所以要提前存储cur.next
cur.next = pre; // 改变指针方向
return reverse(cur, temp); // 等价于:pre = cur, cur = temp
}

浙公网安备 33010602011771号