反转单链表

  1. 我们要反转链表,首先我们必须遍历一遍链表,所以必须有个循环来遍历这个链表
  2. 在反转过程中,我们必须先断开后一个结点,然后指向前一个结点,过程中有两种状态
    1. 当断开后一个结点的时候,此时的链表被分成了三部分,这时我们至少需要三个指针才能完整获取完整链表,所以我们必须要两个指针来记录head的前一个结点和后一个结点,这里我们用nextHead来指向head的后一个结点,用last来指向head的前一个结点(因为反转之后变为后面所以这里称为last)
    2. 当指向前一个结点后,此时链表变成了两部分
  3. 因为每个结点带有一个指针,所以我们只需逐步处理每个结点即可,直到head指向null,表示所有结点都被处理完成,所以这里我们用 head != nullptr 作为循环可以执行的条件,当head == nullptr 时表示结束,因为链表的最后一个结点指向nullptr
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* nextHead = nullptr; 
        ListNode* last = nullptr;
        while(head != nullptr) {
            nextHead = head->next;  //往后移动一个结点
            head->next = nullptr;   //断开后一个结点
            head->next = last;      //连接到前一个结点
            last = head;            //往后移动一个结点
            head = nextHead;        //往后移动一个结点
        }
        return last;
    }
};

剑指 Offer II 024. 反转链表

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值