给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
输入:head = [1,2,3,4] 输出:[2,1,4,3]示例 2:
输入:head = [] 输出:[]示例 3:
输入:head = [1] 输出:[1]
思路:迭代
创建虚拟头结点list,令list->next=head。令pre表示当前到达的节点,
初始时 pre= list。每次需要交换 pre后面的两个节点。
如果 pre的后面没有节点或者只有一个节点,则没有更多的节点需要交换,因此结束交换。否则,获得 pre 后面的两个节点 cur和 later,通过更新节点的指针关系实现两两交换节点。
具体而言,交换之前的节点关系是 pre -> cur -> later,交换之后的节点关系要变成 pre -> later-> cur,因此需要进行如下操作。
cur->next=later->next;
later->next=cur;
pre->next=later;
完成上述操作之后,节点关系即变成 pre -> cur -> later。再令 pre = cur,对链表中的其余节点进行两两交换,直到全部节点都被两两交换。
两两交换链表中的节点之后,新的链表的头节点是 list->next,返回新的链表的头节点即可。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* struct ListNode *next;
* };
*/
struct ListNode* swapPairs(struct ListNode* head) {
struct ListNode* list=malloc(sizeof(struct ListNode));
list->next=head;
struct ListNode* pre;
pre=list;
while(pre->next!=NULL&&pre->next->next!=NULL)
{
struct ListNode* cur=pre->next;
struct ListNode* later=pre->next->next;
cur->next=later->next;
later->next=cur;
pre->next=later;
pre=cur;
}
return list->next;
}