反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL
思路:
这是一道中等难度的题目。首先我们需要往前扫描找到翻转开始节点的父节点,翻转时的节点都会插入这里,所以应保存其位置到reverseInsertPos。然后,用整数NodeCounter来标定现在游标reverseCursor走到了哪个节点,当超过n时停止循环,因此这道题用一个循环是可以轻易完成的。
AC代码:
/** * 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(head == nullptr) return nullptr; ListNode dummyHeadNode(-1); dummyHeadNode.next = head; ListNode* reverseInsertPos= nullptr,* reverseCursor = &dummyHeadNode; int NodeCounter = 1; while(reverseCursor != nullptr && NodeCounter < m) { reverseCursor = reverseCursor->next; NodeCounter++; } reverseInsertPos = reverseCursor; reverseCursor = reverseCursor->next; NodeCounter++; while(reverseCursor != nullptr && reverseCursor->next != nullptr && NodeCounter <= n) { ListNode* temp = reverseCursor->next; reverseCursor->next = reverseCursor->next->next; temp->next = reverseInsertPos->next; reverseInsertPos->next = temp; NodeCounter++; } return dummyHeadNode.next; } };
Published by