题意理解:
交换链表中相邻的两个元素,如原链表为a->b->c->d,修改为b->a->d->c;
题目分析:
1. 不能重新分配多余内存,即只修改指针指向,不增加新的节点内容;
2. 标示要处理的两个相邻元素位置p1,p2,以及p1之前的位置pPre和p2之后的位置pNext;
3. 根据题目要求交换对应位置指针的指向内容;
解题代码:
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* swapPairs(ListNode* head) {
ListNode* ans=head;
int size=0;
ListNode* pCur=head;
while(pCur!=NULL){
size++;
pCur=pCur->next;
}
pCur=head;
if(size<=1){
return ans;
}
ListNode* pPre=new ListNode(0);
ans=pPre;
ListNode* p1;
ListNode* p2;
ListNode* pNext;
for(int i=0; i<size; i+=2){
if(i==0){
pNext=head->next->next;
p1=head;
p2=head->next;
}
pPre->next=p2;
p2->next=p1;
p1->next=pNext;
if(i+2>=size-1){
break;
}
pPre=p1;
p1=pPre->next;
p2=p1->next;
pNext=p2->next;
}
return ans->next;
}
};