【力扣-链表】3、反转链表(206)

1,528 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

206. 反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例 1:

输入: head = [1,2,3,4,5]
输出: [5,4,3,2,1]

示例 2:

输入: head = [1,2]
输出: [2,1]

示例 3:

输入: head = []
输出: []

【双指针法】:

定义一个cur指针,初始时指向头结点;定义一个pre指针,初始化为null,作为前前驱节点。定义一个tmp指针,作为临时节点。

#include <iostream>

using namespace std;

// 链表节点结构体
struct ListNode
{
    int val;
    ListNode *next;
    ListNode(int v) : val(v), next(NULL){};
};

class Solution
{
public:
    // 双指针法
    ListNode *reverseList(ListNode *head)
    {
        // 定义当前节点
        ListNode *cur = head;
        // 定义前驱节点
        ListNode *pre = nullptr;
        // 定义一个临时节点,用来防止断链
        ListNode *tmp;

        // 当前节点非空时
        while (cur)
        {
            // tmp置为下一个节点
            tmp = cur->next;
            // 反转链表
            cur->next = pre;
            // 前驱节点置为当前节点
            pre = cur;
            // 当前节点置为下一个节点
            cur = tmp;
        }

        return pre;
    }

    void printListNode(ListNode *head)
    {
        while (head)
        {
            cout << head->val << " ";
            head = head->next;
        }
        cout << endl;
    }
};
int main()
{
    ListNode *head = new ListNode(1);
    ListNode *p1 = new ListNode(2);
    ListNode *p2 = new ListNode(3);
    ListNode *p3 = new ListNode(4);
    ListNode *p4 = new ListNode(5);
    head->next = p1;
    p1->next = p2;
    p2->next = p3;
    p3->next = p4;
    Solution solu;
    solu.printListNode(head);
    ListNode *newHead = solu.reverseList(head);
    solu.printListNode(newHead);

    return 0;
}

图片.png

【递归法】

递归法与双指针方法逻辑相同,都是当cur位空的时候结束循环,不断将cur指向pre的过程

// 递归法
class Solution
{
public:
    ListNode *reverse(ListNode *cur, ListNode *pre)
    {
        // 当前节点为空时返回
        if (cur == nullptr)
        {
            return pre;
        }
        ListNode *tmp = cur->next;
        cur->next = pre;
        // 递归调用
        return reverse(tmp, cur);
    }
    ListNode *reverseList(ListNode *head)
    {
        return reverse(head, NULL);
    }

    void printListNode(ListNode *head)
    {
        while (head)
        {
            cout << head->val << " ";
            head = head->next;
        }
        cout << endl;
    }
};

图片.png