题目:翻转一部分链表
第一种,只交换链表元素的值。
/**
* 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) {
vector<int>v;
ListNode* temp=head;
while(temp!=NULL)
{
v.push_back(temp->val);
temp=temp->next;
}
while(m<n)
{
v[m-1]=v[m-1]^v[n-1];
v[n-1]=v[m-1]^v[n-1];
v[m-1]=v[m-1]^v[n-1];
m++;n--;
}
temp=head;
int len=v.size();
for(int x;x<len;x++)
temp->val=v[x],temp=temp->next;
return head;
}
};
第二种:采用插入法
比如 : 1->2->3->4->5 m=2,n=4。
第一次操作 : 1->3->2->4->5
第二次操作:1->4->3->2->5
/**
* 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(m==n)return head;
n-=m;
ListNode prehead(0);
prehead.next=head;
ListNode* pre=&prehead;
while(--m)pre=pre->next;
ListNode* pstart=pre->next;
while(n--)
{
ListNode *p=pstart->next;
pstart->next=p->next;
p->next=pre->next;
pre->next=p;
}
return prehead.next;
}
};