剑指offer 23. 反转链表

简介: 剑指offer 23. 反转链表

题目描述

定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。

思考题:

  • 请同时实现迭代版本和递归版本。

数据范围

链表长度 [0,30]。

样例

输入:1->2->3->4->5->NULL
输出:5->4->3->2->1->NULL

方法一:链表+迭代 O(n)

直接设置三个指针分别指向前一个结点,当前结点和下一个结点,然后进行相应操作。我们拿题目的样例举例,来看看具体的实现步骤:



第一步: 设置 curprev 指针,分别指向头结点和 NULL

第二步: 得到 nxt 指针,然后将 nxt 指向的结点的 next 指针指向 cur 指向的结点,将 cur 指向的结点的 next 指针指向 prev 的所指。


c55c9b44e0464e1eae42b8f1ba8acf49.png


第三步:prev 指针更新为 cur 所指,将 cur 指针更新为 nxt 所指,然后重复第二步操作。以此类推,直至 cur 为空。

第四步: 得到最终链表,直接返回即可。


7761ae47562e412392d300bd5aea1a42.png


/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* cur = head;
        ListNode* prev = NULL;
        while (cur)
        {
            ListNode* nxt = cur->next;
            cur->next = prev;
            prev = cur;
            cur = nxt;
        }
        return prev;
    }
};


方法二:链表+递归 O(n)

递归做法其实就是一直递归到底,递归到最后一个结点然后开始回溯,在回溯的过程中改变结点的指针指向。我们还是拿题目样例举例,看看是如何实现的:

第一步: 一直往后递归,直至最后一个结点位置。

d05e0ac3cf824b17a5d03e6977b7ae00.png

第二步: 开始回溯,每次回溯时都去改变当前结点的指针指向,将当前结点的下一个结点的 next 指针指向自己,然后将自己的 next 指针置空,指针返回第一个结点。

304716ddba204c9093695bf3c8d6df64.png


第三步: 返回最终链表。


784e3db9a5e3422a8238782e7547974a.png



/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        if (!head || !head->next) return head;
        ListNode* tail = reverseList(head->next);
        head->next->next = head;
        head->next = NULL;
        return tail;
    }
};

欢迎大家在评论区交流~

目录
相关文章
|
9月前
《剑指offer》——合并两个排序的链表
《剑指offer》——合并两个排序的链表
|
9月前
剑指 Offer 35:复杂链表的复制
剑指 Offer 35:复杂链表的复制
56 0
|
4月前
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
(剑指offer)18、删除链表的节点—22、链表中倒数第K个节点—25、合并两个排序的链表—52、两个链表的第一个公共节点(2021.12.07)
66 0
|
6月前
|
Python
【Leetcode刷题Python】剑指 Offer 22. 链表中倒数第k个节点
Leetcode题目"剑指 Offer 22. 链表中倒数第k个节点"的Python解决方案,使用双指针法找到并返回链表中倒数第k个节点。
68 5
|
6月前
|
Python
【Leetcode刷题Python】剑指 Offer 18. 删除链表的节点
Leetcode题目"剑指 Offer 18. 删除链表的节点"的Python解决方案,通过使用双指针法找到并删除链表中值为特定数值的节点,然后返回更新后的链表头节点。
56 4
|
9月前
|
Java C语言
剑指offer(牛客)——合并两个排序的链表
剑指offer(牛客)——合并两个排序的链表
58 1
|
9月前
|
存储 Java C语言
剑指offer(牛客)——从尾到头打印链表
剑指offer(牛客)——从尾到头打印链表
58 1
|
9月前
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
【一刷《剑指Offer》】面试题 17:合并两个排序的链表
|
9月前
【一刷《剑指Offer》】面试题 16:反转链表
【一刷《剑指Offer》】面试题 16:反转链表
|
9月前
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点
【一刷《剑指Offer》】面试题 15:链表中倒数第 k 个结点