题目考查的知识点
- 递归翻转链表
- 双指针
- 链表的断链与重连
题目解答方法的文字解析
aaaaaa->bbbbbb->ccccccc
其中“bbbbbb”是链表中需要反转的部分
- pH和pT指针初始化为head
- 移动pH和pT指针,使得指向要反转的链表的头节点和尾节点
- 使用递归反转链表“bbbbbb”
- 重新连接链表“ccccccc”
本题解析所用的编程语言
- c++
完整且正确的编程代码
/* aaaaaa->bbbbbb->ccccccc 其中“bbbbbb”是链表中需要反转的部分 */ class Solution { public: ListNode* reverseBetween(ListNode* head, int left, int right) { ListNode*pH = head, *pT = head, *dummyHead=new ListNode(-1), *prev = dummyHead; dummyHead->next = head; right -= left; --left; while(left--){ prev = pH; pH = pH->next; } pT = pH; while(right--){ pT = pT->next; } ListNode*resual = pT->next;// 被翻转的链表的后半部分"ccccccc" pT->next = nullptr; prev->next = helper(pH);// 获得反转后的"bbbbbb", 并让"aaaaaa"连接上这部分 pH->next = resual;// 连接后半部分"ccccccc" return dummyHead->next; } // 翻转链表 ListNode* helper(ListNode* head) { if (head == nullptr || head->next == nullptr)return head; ListNode* ret = helper(head->next); ListNode* hNext = head->next; head->next = nullptr; hNext->next = head; return ret; } };