LeetCode 反转链表

91 阅读2分钟

LeetCode 反转链表

当谈到解决链表问题时,反转链表是一道经典题目。如何反转一个单向链表是一个非常基本的算法问题。本文将介绍如何解决这个挑战,并且提供Java代码示例。

  1. 题目描述

本题目的描述为:反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 链表可以迭代或递归地反转。你能否两个都实现一遍?

  1. 解题思路

反转链表的思路很简单,需要遍历链表并将每个节点的next指针指向其前面的节点。在这个过程中,需要两个额外的指针进行串联的操作。注意需要处理空链表和一个节点的链表的情况。

在本题目中,需要考虑两种方法来实现链表反转,即迭代和递归。

迭代法

我们可以定义三个指针,分别为 prev、curr 和 next,其中 curr 移动到链表的下一个节点时,prev 和 curr 都移向下一个节点。同时,修改 curr 的指针指向 prev。

最后需要将末尾的节点指向 null,并返回新的头节点。

示例:

假设原始链表为:1 -> 2 -> 3 -> null

  1. 初始化:

null <- 1 -> 2 -> 3 -> null prev curr next

  1. 反转第一个节点:

null <- 1 2 -> 3 -> null prev curr next

  1. 反转第二个节点:

null <- 1 <- 2 3 -> null prev curr next

  1. 反转第三个节点:

null <- 1 <- 2 <- 3 null prev curr

最后需要在迭代结束时返回 prev。

递归法

递归法的思路也很简单,我们可以选择开始时反转第一个节点。接着,利用递归反转剩下的链表。最后,将两个链表连接。

这个方法需要在每个节点的递归过程中修改指针指向,不过需要特别注意处理空链表和一个节点的链表的情况。

示例:

假设原始链表为:1 -> 2 -> 3 -> null

  1. 反转第一个节点,返回后续已反转链表的头节点2

null <- 1 2 -> 3 -> null head

  1. 反转第二个节点,返回已反转链表的头节点3

null <- 1 <- 2 3 -> null head

  1. 反转第三个节点,返回过程结束,将已反转链表与head连接

null <- 1 <- 2 <- 3 null

最后需要在递归结束时返回已反转链表的头节点。

  1. 代码实现

迭代法

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        ListNode prev = null;
        ListNode curr = head;
        ListNode next = null;
        
        while (curr != null) {
            next = curr.next;
            curr.next = prev;
            prev = curr;
            curr = next;
        }
        
        return prev;
    }
}

递归法

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; }
 * }
 */
class Solution {
    public ListNode reverseList(ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        
        ListNode p = reverseList(head.next);
        head.next.next = head;
        head.next = null;
        return p;
    }
}
  1. 总结

本文介绍了如何使用迭代和递归方法,来反转一个单向链表的方法实现。希望本文能够帮助各位理解链表反转的重要性和实现方法。