题解 | #反转链表#

反转链表

https://www.nowcoder.com/practice/75e878df47f24fdc9dc3e400ec6058ca

方法一:迭代

  • 先创建一个pre和一个cur的ListNode变量;
  • 然后迭代遍历链表,然后反转指针指向。

复杂度

  • 时间复杂度为O(N);
  • 空间复杂度为O(1)。
/**
 * struct ListNode {
 *	int val;
 *	struct ListNode *next;
 *	ListNode(int x) : val(x), next(nullptr) {}
 * };
 */
class Solution {
public:
    ListNode* ReverseList(ListNode* head) {
        ListNode* pre = NULL;
        ListNode* cur = head;

        while(cur!=NULL)
        {
            ListNode* tmp = cur->next;
            cur->next = pre;
            pre = cur;
            cur = tmp;
        }
        return pre;
    }
};

方法二:递归

  • 先判断指针和next指针是否为NULL,如果是就返回该指针;
  • 将当前指针的next指针作为参数继续递归;
  • 将当前指针的下一个指针的next指向当前指针;
  • 之后让当前节点的next指针指向NULL,实现从链表尾部开始的局部反转;
  • 最后返回结果。

复杂度

  • 时间复杂度为O(N);
  • 空间复杂度为O(N),递归栈。
class Solution {
public:
    ListNode* ReverseList(ListNode* head) {
        if(head == NULL || head->next == NULL)
        {
            return head;
        }

        ListNode* res = ReverseList(head->next);
        head->next->next = head; // 反转指针

        head->next = NULL; // 让当前节点的next指针指向NULL,实现从链表尾部开始的局部反转
        return res;
    }
};

全部评论

相关推荐

04-29 22:35
门头沟学院 Java
牛友说改了名字能收到offer:旧图新发查看图片
点赞 评论 收藏
分享
04-10 11:56
如皋中学 Java
高斯林的信徒:双c9能简历挂的?
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务