206 翻转链表

117 阅读2分钟

206 翻转链表

LeetCode


描述:

  • 输入一个链表的头指针, 将这个链表翻转.
image-20220404170012013

思路:

  • 此题是链表的基础概念的考察, 将其翻转, 最简单暴力的方法就是创建新链表, 遍历就链表.
  • 但这种方法通常是没必要的, 根据链表的含义, 通过改变每个链表元素的指针域的指向, 就可以将链表翻转.
    1. 判断输入头指针为空的情况
    2. 初始化元素, 保存临时遍历元素: ListNode *temp, 当前遍历元素: ListNode *cur = head, 当前遍历元素的前一个元素: ListNode *pre = nullptr(初始情况当前元素为头元素, 反转后头元素为最后一个元素, 其指针域指向nullptr)
    3. 遍历链表, 当前遍历元素不为空进行遍历
    4. temp保存当前遍历元素的所指向的下一个元素 (temp = cur -> next)
    5. 令当前元素cur的指针域指向前一个元素pre (cur -> next = pre)
    6. 步骤5, 进行了交换操作, 此时, 在开始下一次遍历时, 需要进行遍历更新操作, 下一次"当前遍历元素"cur变为下一个(即temp), 下一次"当前遍历元素的前一个元素"pre即为现在的cur. (pre = cur; cur = temp)
    7. 遍历结束, 返回pre.

代码:

/*
 * @lc app=leetcode.cn id=206 lang=cpp
 *
 * [206] 反转链表
 */

// @lc code=start
/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution
{
public:
    ListNode *reverseList(ListNode *head)
    {
        if (head == nullptr || head->next == nullptr)
        {
            return head;
        }

        ListNode *temp;
        ListNode *cur = head;
        ListNode *pre = nullptr;
        while (cur != nullptr)
        {
            temp = cur->next;
            
            cur->next = pre;
            pre = cur;
            cur = temp;
        }
        return pre;
    }
};

参考:

代码随想录