LeetCode 206. 反转链表 Reverse Linked List (Easy) 《剑指offer》第二十四题:反转链表

反转一个单链表。力扣

示例:

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

解法一:迭代法。通过三个值保存信息。

/**
 * 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* pRevHead = nullptr;  //反转后的头部
        ListNode* pCurrent = head;  //头节点作为当前节点
        ListNode* pBefore = nullptr;  //前一个节点
        
        while (pCurrent != nullptr)  //节点为空时跳出
        {
            ListNode* pNext = pCurrent->next;  //保存下一节点

            if (pNext == nullptr) pRevHead = pCurrent; //如果到了尾节点, 当前节点作为头节点

            pCurrent->next = pBefore;  //当前节点指向前一个节点

            pBefore = pCurrent;  //更新两个值
            pCurrent = pNext;
        }
        return pRevHead;
    }
};

解法二:递归法

/**
 * 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 == nullptr || head->next == nullptr)
            return head;

        //先反转后面的节点, 寻找末尾节点
        ListNode* pReverseNode = reverseList(head->next);

        //将当前节点设置为下一节点的后续节点
        head->next->next = head;
        head->next = nullptr;
        
        return pReverseNode;
    }
};

类似题目:《剑指offer》第二十四题:反转链表

猜你喜欢

转载自www.cnblogs.com/ZSY-blog/p/12805271.html