【leetcode】206. 反转链表( Reverse Linked List )


题目描述

【leetcode】206. 反转链表( Reverse Linked List )

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
进阶:
你可以迭代或递归地反转链表。你能否用两种方法解决这道题?

第一次解答

思路
一边遍历一边反转指针指向,为了能够反转,需要保存中间变量。
迭代的方法,时间复杂度O(n),空间复杂度O(1)。

test case:

代码:

/**
 * 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 *p_next = NULL;
        ListNode *p_last = NULL;

        while(NULL != head){
            p_next = head->next;//暂存
            head->next = p_last;//反转当前元素指向
            p_last = head;//暂存
            head = p_next;//指向下个元素
        }
        return p_last;
    }
};

结果:

在这里插入图片描述

第二次解答

思路:
递归,难点是怎么取出最后元素,思路有点巧妙。
参考官方题解
ListNode* reverseList(ListNode* head)表示:
反转从head开始的链表
ListNode* reverseList(ListNode* head->next)表示:
反转从head->next开始的链表

代码:

/**
 * 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(NULL == head || NULL == head->next)
            return head;
        ListNode *end = reverseList(head->next);//反转后续元素
        //反转当前元素
        head->next->next = head;
        head->next = NULL;//为什么要这句?中间元素没问题,但最后一个元素(就是反转前第一个元素)一定要这个

        return end;
    }
};

结果:
在这里插入图片描述

相关/参考链接

官方题解

发布了88 篇原创文章 · 获赞 61 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/a435262767/article/details/104353177