【Leetcode 92】链表反转

刷题记录 专栏收录该内容
16 篇文章 0 订阅

0.题目

Given the head of a singly linked list and two integers left and right where left <= right, reverse the nodes of the list from position left to position right, and return the reversed list.

Example 1:

Input: head = [1,2,3,4,5], left = 2, right = 4
Output: [1,4,3,2,5]
Example 2:

Input: head = [5], left = 1, right = 1
Output: [5]
 

Constraints:

The number of nodes in the list is n.
1 <= n <= 500
-500 <= Node.val <= 500
1 <= left <= right <= n

1.递归反转整个链表

递归返回后,head的nextt仍指向反转链表末尾,修改末尾指针即可,而反转链表头部则从递归最深层逐渐传递出去。

2.反转链表前 N 个节点

 需记录最后一个反转点的下一个结点,作为头部的接点
special case:反转所有节点,此时下一个结点为NULL

3. 反转链表的一部分

只需逐步向前迭代,到达需反转的起点,即可调用2的反转链表前 N 个节点方法

4. 代码

/**
 * 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* last=NULL;
    ListNode* keep=NULL;
    ListNode* reverseN(ListNode* head,int num)
    {
        //只需反转其本身
        if(num==1)
        {
            keep=head->next;
            return head;
            
        }
        last=reverseN(head->next,num-1);
        head->next->next=head;
        head->next=keep;
        return last;
        
    }
     ListNode* start=NULL;
    ListNode* reverseBetween(ListNode* head, int left, int right)
    {
        
        if(left==1)
        {
            return reverseN(head,right);
            
        }
            
        else
        {
           head->next=reverseBetween(head->next,left-1,right-1);
           return head;
        }
        
        
    }
    

    
};

参考链接: link.

  • 0
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2020 CSDN 皮肤主题: 数字20 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值