一、题目:
24.两两交换链表中的结点:
给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。
示例:
给定1->2->3->4
你应该返回2->1->4->3
说明:
- 你的算法只能使用常数的额外空间。
- 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。
二、思路:
采用一个结点f指向两个需要交换的结点的前一个,首先进行删除前一个结点的操作,再把需要交换的第二个结点指向f,完成一次两两交换。需要交换的次数=链表的长度/2。
三、代码(C++):
ListNode* swapPairs(ListNode* head) {
ListNode *l=head;
int length=0;
while(l) // 计算链表的长度
{
++length;
l=l->next;
}
int j=length/2; // j=length/2 记录需要循环交换的次数
ListNode *t=new ListNode(0); // 引入一个头结点方便操作
t->next=head;
head=t;
ListNode *p=t;
ListNode *f=p->next;
while(j) //两两交换,循环j次
{
p->next=f->next;
f->next=p->next->next;
p->next->next=f;
p=p->next->next;
f=f->next;
--j;
}
return head->next; //返回头指针的下一个结点
}