【leetcode】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

进阶:链表可以选用迭代或递归方式完成反转。你能否用两种方法解决这道题?

/**
 * 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) {

    }
}

代码实现:

方法一:

/**
 * 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 prev = null;
        ListNode current = head;
        
        while (current != null) {
            ListNode nextNode = current.next;
            current.next = prev;
            prev = current;
            current = nextNode;
        }
        
        return prev;
    }
}

在这个简化后的代码中,我们仍然使用 prevcurrent 两个指针来遍历链表并进行倒序操作。每次都将当前节点的 next 指针指向前一个节点,然后更新 prevcurrent 指针位置。

方法二:

/**
 * 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) {
        if (head == null || head.next == null) {
            return head;
        }
        
        ListNode newHead = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        
        return newHead;
    }
}

这个递归算法的思路是先递归调用 reverseList方法来将除去头节点的子链表进行倒序处理,得到新的头节点 newHead。然后,将原头节点 head 的下一个节点的 next 指针指向 head,并将 headnext 指针置为 null,从而完成节点的倒序。

最终返回新的头节点 newHead,即为倒序后的链表。

这种递归实现方式代码简短,但需要注意在链表较长时可能会导致递归深度过大而引发堆栈溢出的问题。

相关推荐

  1. leetcode206.

    2024-02-10 09:10:04       37 阅读
  2. LeetCode206

    2024-02-10 09:10:04       33 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-02-10 09:10:04       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-02-10 09:10:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-02-10 09:10:04       20 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-02-10 09:10:04       20 阅读

热门阅读

  1. 哈希算法 c语言

    2024-02-10 09:10:04       27 阅读
  2. 即大而全又小而美

    2024-02-10 09:10:04       25 阅读
  3. Gradle IDEA 乱码

    2024-02-10 09:10:04       33 阅读
  4. 突破编程_C++_基础教程(类的基础知识)

    2024-02-10 09:10:04       30 阅读
  5. PyTorch: torch.max()函数详解

    2024-02-10 09:10:04       30 阅读
  6. 语义分割任务的准确率计算:基于PyTorch实现

    2024-02-10 09:10:04       34 阅读
  7. ARM交叉编译搭建SSH

    2024-02-10 09:10:04       33 阅读
  8. 并发、串行与同步、异步

    2024-02-10 09:10:04       28 阅读
  9. 微信小程序:父组件调用子组件的方法

    2024-02-10 09:10:04       32 阅读