反转一个链表

1.大体思路就是:让链表的第一个节点(除去头节点)先指向null,这样就断开了和第二个节点的连接,然后让第二个节点指向第一个节点....以此类推,直到最后一个节点指向倒数第二个节点,重新赋一个头节点;

2确定一个主移动的指针curr保证反转的进行,一开始他指向第一个节点(相当与头节点).他的任务就是推进节点移动(curr=curr->next)

3.其中,我们用一个prev指针来切断和前一个节点的连接,所以他一开始指向null,每次更新完curr之后,curr->next=prev,让他给箭头掉头,然后一次反转就结束了,然后再把让curr变成下一轮的prev,prev=curr;

4.注意!,为保证每次curr能顺利移动,需要反转之前用一个next先存储下一轮的主节点(curr->next=next),然后在反转结束后我们就可以移动curr了!(curr=next)

总结一下特点,每一轮的反转我们最后都让prev前进了&& 让curr和next指向了下一轮的主节点,所以最后为了反转最后一个节点,我们做完curr->next=prev后我们又更新了prev和next和curr,所以最后prev为最后一个原链表中的有效节点,而curr和next都指向了null!所以最后一步就是head=prev

代码如下:

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

        while(curr!=nullptr){
              next=curr->next;
            curr->next=prev;
            prev=curr;
            curr=next;
        }
        return prev;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值