206. 反转链表

206. 反转链表

LeetCode_206

题目详情

解法一:迭代法

package com.walegarrett.interview;
/**
 * @Author WaleGarrett
 * @Date 2021/2/22 22:30
 */
import java.util.List;
/**
 * 题目描述:反转一个单链表。你可以迭代或递归地反转链表。你能否用两种方法解决这道题?
 */
class ListNode {
    int val;
    ListNode next;
    ListNode() {}
    ListNode(int val) { this.val = val; }
    ListNode(int val, ListNode next) { this.val = val; this.next = next; }
}
/**
 * 方法一:使用迭代的方式
 */
public class LeetCode_206 {
    public ListNode reverseList(ListNode head) {
        ListNode now = head;
        ListNode pre = null;
        while(now!=null){
            ListNode next = now.next;
            now.next = pre;
            pre = now;
            now = next;
        }
        return pre;
    }
}

解法二:递归法

  1. 相对于迭代法,使用递归法比较难以想到解决的办法。
  2. 使用递归法,我们首先需要重新定义一个方法,返回结果为新的头节点,参数为当前节点和当前节点的前置节点。
  3. 在每次递归的过程之后,需要设置当前节点的next指针指向前置节点pre。而递归中设置的中间节点result的作用仅仅是存储新的最终头节点并返回。
  4. 需要注意的是,在边界条件中,当当前节点为null时需要返回pre节点,而不是current节点,因为pre节点才是新的头节点。
/**
 * 解法二:递归解法,在回溯时需要设置next指针
 */
class LeetCode_206_2 {
    public ListNode reverseList(ListNode head) {
        return dfs(head, null);
    }
    ListNode dfs(ListNode current, ListNode pre){
        if(current == null)
            return pre;//这里返回的有点难以理解,这里其实是达到原始链表尾部就返回最后的那个元素。这个元素作为新链表的头指针。
        ListNode result = dfs(current.next, current);
        current.next = pre;
        return result;
    }
}
posted @   Garrett_Wale  阅读(53)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
历史上的今天:
2020-02-23 LeetCode-重建二叉树(前序遍历+中序遍历)
2020-02-23 LeetCode-二叉搜索树的范围和
点击右上角即可分享
微信分享提示