反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4 输出: 1->4->3->2->5->NULL
/
思路: 本题采用头插法 的解题思路,实现链表反转问题。
即将m节点后的n-m个节点一次插入到m节点的前面。
//
/**
* 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) {
ListNode* p ;
ListNode* firstNode = new ListNode(0); //设置一个头节点,方便统一操作
firstNode->next = head ;
if(head->next == NULL ) return head ;
int i ;
i = n-m;
p = firstNode ;
m--;
while(m--)
{
p = p->next ;
}
//return p ; ///测试一下 p点是否在 m节点的前一个节点
ListNode* s ;
s = p->next ; // s实际上就是m节点
while(i--)
{
ListNode *node; //node 即为需要反转的节点 将其 插入到p节点到m节点之间
node =s->next ;
s->next=s->next->next; //删除已经完成插入的节点
node->next = p->next ;
p->next = node ;
}
return firstNode->next ;
}
};