单链表反转

·  阅读 322

题目描述

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

给定:1 -> 2 -> 3 -> 4 -> 5

返回:5 -> 4 -> 3 -> 2 -> 1

代码

/**
 * 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) {
        
        ListNode *pre = nullptr, *curr = head, *next = nullptr;

        while (curr != nullptr) {
            next = curr->next;
            curr->next = pre;
            // pre 和 curr 节点后一栋一步
            pre = curr;
            curr = next;
        }
        return pre;
    }
};
复制代码

解题思路

初始状态

初始状态只需要将prenext节点指向nullptrcurr节点指向head节点。 image.png

循环步骤

第一步我们需要先保存curr节点的下一个节点,以便后续使curr节点往后移动一步。 image.png

curr指向方向进行反转,指向pre节点。

  1. 反转后尾节点应该指向nullptr,因此pre节点初始为nullptr
  2. 反转前需要记录curr的 next 节点,使得curr下一步往后移动。

image.png

curr反转指向方向后,先将pre节点指向curr当前的位置,相当于pre节点向后移动一步。 image.png

此时把curr节点指向next节点,完成向后一步移动。

image.png

整体流程

单链表反转.png

分类:
后端
标签:
分类:
后端
标签:
收藏成功!
已添加到「」, 点击更改