每日打卡算法题

110 阅读1分钟

这是我参与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) {
       
    }
}

这道题并不是很难,我们可以采用迭代器和递归的方式来做

迭代器

迭代器的想法就十分简单,我们就直接的去想去操作就可以,就是将我们链表中的指针颠倒一下就可以

F89096FF15BD5669722544BDE70CD017.JPG

具体的操作就像是我们调换变量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指向反转

递归

如果用递归的思想,刚开始的时候就会比较难想到,但是和我们的迭代器还是有一些相似的

93E81FB2D7892784A853A09D4FE039FD.jpg

递归的好处就就是我们就只需要解决这一个问题,其他问题就解决了

        if (head == null || head.next == null) {
            return head;
        }
        ListNode newHead = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return newHead;

因为是递归调用,我们需要的空间复杂度就很大,链表长度就决定了我们栈的深度