反转从位置 m 到 n 的链表。请使用一趟扫描完成反转。
说明:
1 ≤ m ≤ n ≤ 链表长度。
示例:
输入: 1->2->3->4->5->NULL, m = 2, n = 4
输出: 1->4->3->2->5->NULL
算法:我们先反转中间(2->3->4==>4->3->2),再把剩余两部分接上。
/** * 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)return NULL; auto l=new ListNode(-1); l->next=head; auto p=l; for(int i=0;i<m-1;i++)p=p->next; auto a=p->next,b=a->next; for(int i=m;i<n;i++){ auto c=b->next; b->next=a; a=b; b=c; } p->next->next=b; p->next=a; return l->next; } };
原文:https://www.cnblogs.com/programyang/p/11161137.html