力扣206反转链表

本文介绍了如何使用双指针和递归方法来解决LeetCode中的反转链表问题,对比了头插法的复杂度,并提供了C++代码实现。
摘要由CSDN通过智能技术生成

206.反转链表

力扣题目链接(opens new window)

题意:反转一个单链表。

示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL

1,双指针

2,递归。递归参考双指针更容易写,

为什么不用头插法呢,因为头插法的空间复杂度为O(N),时间复杂度为O(n)

 //双指针
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode * cur = head;//指向当前操作结点
        ListNode * pre = NULL;//指向cur的前一个结点
        ListNode * temp;
        if(cur== NULL|| cur ->next ==NULL)
        {
                return head;
        }
        while(cur!=NULL){
            temp  = cur->next;//temp记录cur的下一个结点
            cur->next = pre;//cur指向前一个结点
            pre = cur;//pre后移
            cur = temp;//cur后移
        }
        return pre;//最后返回pre作为头节点
    }
};
/**
 * 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 == NULL)
            return pre;//递归终止入口
        ListNode * temp = cur->next;
        cur->next = pre;
        return reverse(cur,temp);
    }
    ListNode* reverseList(ListNode*head){
        return reverse(NULL,head);
    }

};

双指针:                                                                                        递归: 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值