【每日算法】LeetCode 92 —— 翻转链表(一百八十四)

题目内容

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

示例

示例 1:

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

示例 2:

输入:head = [5], left = 1, right = 1
输出:[5]

提示

1、链表中节点数目为 n
2、1 <= n <= 500
3、-500 <= Node.val <= 500
4、1 <= left <= right <= n

题解

本题考查链表的操作,因此采用画图的思路求解最方便,模拟一下这个过程然后敲代码就行了。

具体思路就如下图所示:

1、首先,获得left指针的节点和right指针的节点以及left指针前一个节点

2、然后将left和right内部的指针指向翻转

3、然后将left前一个节点指向right,将left的下一个节点指向right的下一个节点

这里注意:引入虚拟头结点用来统一头结点与其他节点的操作,使其操作保持一致。

代码

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* reverseBetween(ListNode* head, int m, int n) {
if (m == n) return head;
ListNode *dummy = new ListNode(0);
dummy->next = head;
ListNode *p = dummy;
for (int i = 0; i < m - 1; i ++ )
p = p->next;
ListNode *a = p, *b = a->next, *c = b->next;
for (int i = m + 1; i <= n; i ++ )
{
ListNode *d = c->next;
c->next = b;
b = c;
c = d;
}
a->next->next = c;
a->next = b;
return dummy->next;
}
};
Author: Frederic Niu
Link: https://www.fredericniu.cn/2021/07/05/【每日算法】LeetCode-92-——-翻转链表(一百八十四)/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
我的公众号