这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
输入: [1,2,3,4,5]
输出: [5,4,3,2,1]
/**
* 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) {
}
}
这道题并不是很难,我们可以采用迭代器和递归的方式来做
迭代器
迭代器的想法就十分简单,我们就直接的去想去操作就可以,就是将我们链表中的指针颠倒一下就可以
具体的操作就像是我们调换变量a,b中的值一样,我们new一个值,来承接交换值
//创建两个新节点用于交换的左右两边
ListNode right = null;
ListNode left = head;
//当我们原来的节点不为空的时候往下进行
while (left != null) {
ListNode next = left.next;
left.next = right;
right = left;
left = next;
}
return right;
我们交换的过程是一个横向的过程相邻的两个节点之间把next指向反转
递归
如果用递归的思想,刚开始的时候就会比较难想到,但是和我们的迭代器还是有一些相似的
递归的好处就就是我们就只需要解决这一个问题,其他问题就解决了
if (head == null || head.next == null) {
return head;
}
ListNode newHead = reverseList(head.next);
head.next.next = head;
head.next = null;
return newHead;
因为是递归调用,我们需要的空间复杂度就很大,链表长度就决定了我们栈的深度