24. 两两交换链表中的节点
给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
题解:代码随想录 ---24. 两两交换链表中的节点
c
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
/*创建一个虚拟节点:一开始该节点指向要交换的两个结点前,借助两个辅助变量完成交换,
交换完成后,该虚拟节点移动两个结点,继续进行下一轮交换,直到虚拟节点next域指向空(偶数节点),
虚拟节点next的next域指向空(注意偶数节点与奇数节点的结束条件)*/
struct ListNode* swapPairs(struct ListNode* head) {
struct ListNode *newnoode=malloc(sizeof(struct ListNode));//创建虚拟节点
newnoode->next=head;//指向头结点
struct ListNode *cur=newnoode;//移动的节点
//奇数和偶数节点的结束条件
while(cur->next && cur->next->next)
{
struct ListNode *temp=cur->next; //保存第一个结点
struct ListNode *temp1=cur->next->next->next;//保存第三个节点
cur->next=cur->next->next;//步骤1
cur->next->next=temp;//步骤2
cur->next->next->next=temp1;//步骤3
//更新节点
cur=cur->next->next;
}
struct ListNode *result=newnoode->next;
free(newnoode);
return result;
}