给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
示例:
给定1->2->3->4
, 你应该返回2->1->4->3
.
说明:
- 你的算法只能使用常数的额外空间。
- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
//======================================================================
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* swapPairs(struct ListNode* head) {
if(head == NULL || head->next == NULL)
{
return head;
}
//处理头结点
struct ListNode *newhead = head->next;
struct ListNode *pnext=head->next->next;
head->next->next=head;
head->next=NULL;
struct ListNode *prev=newhead->next;
struct ListNode *pcur=pnext;
prev->next=pcur;
//依次处理后续结点
while(pcur && pcur->next)
{
//备份下下个结点
pnext = pcur->next->next;
//翻转两个结点
pcur->next->next = pcur;
//把第二个结点挂到前面去
prev->next = pcur->next;
//把第一个结点挂到后面去
pcur->next = pnext;
//往后前进
prev=pcur;
pcur = pnext;
}
return newhead;
}