92. Reverse Linked List II
一、题目分析
题目要求逆转链表的第m到第n个之间的结点,因此思路是,讲m和n之间的结点单独拎出来作为一个单独的链表,进行逆转
然后问题退化为,逆转一个单链表。
可以采用递归的方式,每次传入上一个结点和当前结点,将当前结点指向上一个结点
然后将当前结点和下一个结点再次调用该方法
代码如下所示:
class Solution { public: //逆转链表,head是下部分的链表头,last是上一个节点。 ListNode* reverseList(ListNode* head, ListNode* last) { if(head) { ListNode* next = head->next; head->next = last; return this->reverseList(next, head); } return last; } //逆转链表,第m->n个节点 ListNode* reverseBetween(ListNode* head, int m, int n) { ListNode *dummy = new ListNode(-1); dummy->next = head; ListNode *p = dummy; ListNode *pLeftPrev = NULL, *pLeft = NULL, *pRight = NULL, *pRightNext = NULL; for (int i = 0; i <= n && p; i++) { if(i == m - 1) { pLeftPrev = p; pLeft = p->next; } if(i == n) { pRight = p; pRightNext = p->next; } p = p->next; } pRight->next = NULL; this->reverseList(pLeft, NULL); pLeftPrev->next = pRight; pLeft->next = pRightNext; p = dummy->next; free(dummy); return p; } };