单链表翻转的第二个版本。
题目:Reverse a linked list from position m to n. Do it in-place and in one-pass.
For example:
Given1->2->3->4->5->NULL, m = 2 and n = 4,
return1->4->3->2->5->NULL.
Note:
Given m, n satisfy the following condition:
1 ≤ m ≤ n ≤ length of list.
思路:仍然使用上一个翻转链表的思想。先定义一个计数器,用两个指针,找到链表翻转的起始地和它的上一个节点pre,记录下这个pre节点,从翻转开始,每一次把当前节点后面的一个节点放到pre后面,如此循环n-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) {
if(head==NULL || head->next==NULL){
return head;
}
ListNode *dummy = new ListNode(-1);
dummy->next = head;
ListNode *pre = dummy;
ListNode *cur = head;
int idx = 1;
while(idx < m){//往后走m-1个,找到翻转的起始点
pre = pre->next;
cur = cur->next;
idx++;
}
for(int i = 0;i < (n-m);i++){//循环n-m次,刚好翻转m到n之间的节点
ListNode *temp = cur->next;
cur->next = temp->next;
temp->next = pre->next;
pre->next = temp;
}
return dummy->next;
}
};