LeetCode 反转链表
当谈到解决链表问题时,反转链表是一道经典题目。如何反转一个单向链表是一个非常基本的算法问题。本文将介绍如何解决这个挑战,并且提供Java代码示例。
- 题目描述
本题目的描述为:反转一个单链表。
示例:
输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 进阶: 链表可以迭代或递归地反转。你能否两个都实现一遍?
- 解题思路
反转链表的思路很简单,需要遍历链表并将每个节点的next指针指向其前面的节点。在这个过程中,需要两个额外的指针进行串联的操作。注意需要处理空链表和一个节点的链表的情况。
在本题目中,需要考虑两种方法来实现链表反转,即迭代和递归。
迭代法
我们可以定义三个指针,分别为 prev、curr 和 next,其中 curr 移动到链表的下一个节点时,prev 和 curr 都移向下一个节点。同时,修改 curr 的指针指向 prev。
最后需要将末尾的节点指向 null,并返回新的头节点。
示例:
假设原始链表为:1 -> 2 -> 3 -> null
- 初始化:
null <- 1 -> 2 -> 3 -> null prev curr next
- 反转第一个节点:
null <- 1 2 -> 3 -> null prev curr next
- 反转第二个节点:
null <- 1 <- 2 3 -> null prev curr next
- 反转第三个节点:
null <- 1 <- 2 <- 3 null prev curr
最后需要在迭代结束时返回 prev。
递归法
递归法的思路也很简单,我们可以选择开始时反转第一个节点。接着,利用递归反转剩下的链表。最后,将两个链表连接。
这个方法需要在每个节点的递归过程中修改指针指向,不过需要特别注意处理空链表和一个节点的链表的情况。
示例:
假设原始链表为:1 -> 2 -> 3 -> null
- 反转第一个节点,返回后续已反转链表的头节点2
null <- 1 2 -> 3 -> null head
- 反转第二个节点,返回已反转链表的头节点3
null <- 1 <- 2 3 -> null head
- 反转第三个节点,返回过程结束,将已反转链表与head连接
null <- 1 <- 2 <- 3 null
最后需要在递归结束时返回已反转链表的头节点。
- 代码实现
迭代法
/**
* 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;
}
}
- 总结
本文介绍了如何使用迭代和递归方法,来反转一个单向链表的方法实现。希望本文能够帮助各位理解链表反转的重要性和实现方法。