Given a linked list, swap every two adjacent nodes and return its head.
For example,
Given 1->2->3->4
, you should return the list as 2->1->4->3
.
Your algorithm should use only constant space. You may not modify the values in the list, only nodes itself can be changed.
pro:给一个链表,要求将链表以2个节点为一组翻转,从head开始
sol:这个是Reverse in Group的简化版本。
1.我们使用指针pre,cur,next来遍历链表。pre初始为root,cur初始为head,next初始为cur->next。当然链表为空或者链表只有一个节点的情况要预先处理
2.pre每次指向上一组的末尾,cur指向下一组的开始,next指向cur的下一个节点。那翻转的操作就是:
pre->next = next;
cur->next = next->next;
next->next = cur;
3.然后更新各个指针:需要先将pre设为cur(也就是这一组的最后一个节点),再判断下一个以及下下个是否为空,否则分别就是cur和next。
code:
class Solution {
public:
ListNode *swapPairs(ListNode *head)
{
if(head==NULL||head->next==NULL) return head;
ListNode *pre,*cur,*next,*temp;
ListNode *root = new ListNode(0);
root->next = head;
pre = root;
cur=head;
next = cur->next;
while(1)
{
temp = next;
pre->next = next;
cur->next = next->next;
next->next = cur;
pre = cur;
if(pre->next!=NULL)
cur = pre->next;
else break;
if(pre->next->next!=NULL)
next = pre->next->next;
else break;
}
return root->next;
}
};