翻转链表中第m个节点到第n个节点的部分
注意事项
m,n满足1 ≤ m ≤ n ≤ 链表长度
样例
给出链表1->2->3->4->5->null, m = 2 和n = 4,返回1->4->3->2->5->null
思路:
1,将需要反转的部分的成员变量值val存进数组nums[10000]中,并记录第一个反转位置temp2。
2,将nums中的值倒序逐个赋值给temp2指向的链表。
3,返回head。
优点:不存在复杂的next指针变换
缺点:时间复杂度为O(m*n)。
/**
* Definition of singly-linked-list:
*
* class ListNode {
* public:
* int val;
* ListNode *next;
* ListNode(int val) {
* this->val = val;
* this->next = NULL;
* }
* }
*/
class Solution {
public:
/**
* @param head: The head of linked list.
* @param m: The start position need to reverse.
* @param n: The end position need to reverse.
* @return: The new head of partial reversed linked list.
*/
ListNode *reverseBetween(ListNode *head, int m, int n) {
// write your code here
ListNode *temp1=head,*temp2,*temp3=head;
int i=0,min,max,nums[10000];
min=n>=m?m:n;
max=n>=m?n:m;
if(min==0||head==NULL)
return head;
while(1){
if(i==min-1)
temp2=temp1;
if(i>=min-1&&i<=max-1){
nums[i]=temp1->val;
}
if(temp1->next==NULL)
break;
temp1=temp1->next;
i++;
}
// cout<<nums[34]<<" "<<nums[35];
i=min-1;
int j=0;
while(i<max){
temp2->val=nums[max-1-j];
temp2=temp2->next;
i++;
j++;
}
return head;
}
};