反转链表相关

该文章介绍了如何反转单链表,提供了两种方法:双指针法和递归法。双指针法通过维护pre、cur、temp三个指针,不断调整节点的next指针实现反转;递归法则通过递归调用反转下一个节点,当遇到空节点时返回当前pre作为反转后的头节点。
摘要由CSDN通过智能技术生成

力扣题目206:反转链表

        对上述链表进行反转后为:

         反转过程即改变各个结点指针域(next)的指向。

1)双指针法

         首先初始化三个结点,pre指向NULL;cur指向head;temp可以先不指向(因为后续调整next指向时需要用其来保存下一个结点)。

        循环中,如果cur指向不为NULL,则继续循环。首先将cur的下一个结点2保存至temp中,cur指向结点1的指针域指向改为pre(NULL),然后将pre更新至cur处(保存前一个结点,下次循环中使用)。最后将cur进行更新为temp。

        继续循环(cur指向结点2,不为NULL),结点3保存至temp中,cur(结点2)的指针域指向pre,pre更新为cur当前值(结点2),cur更新为temp,进行下次循环。

         其余结点同理。cur为NULL时,反转完成,循环结束。当前链表的头结点为pre所保存的值,即为结点5。

/**
 * 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* cur = head;
    ListNode* pre = nullptr;
    ListNode* temp;
    while (cur) {
        temp = cur->next;
        cur->next = pre;
        pre = cur;
        cur = temp;
    }
    return pre;
    }

};

2)递归法

        

/**
 * 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* reverse(ListNode* pre, ListNode* cur){
        if (cur == nullptr)
            return pre;//即为最后的头结点
        ListNode* temp = cur->next;
        cur->next = pre;
        pre = cur;
        return reverse(pre,temp);
    }
    ListNode* reverseList(ListNode* head) {//递归法
        return reverse(nullptr,head);
    }
};

        递归法的实现与双指针的基本逻辑是一样的,如果当前指向的是NULL了,则代表已经反转完成了,返回当前的pre(反转后的头结点)。

        否则进行反转操作,即更新各结点的next。然后继续递归调用reverse反转下个结点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值