给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:

输入:head = [1,2,3,4] 输出:[2,1,4,3]
示例 2:
输入:head = [] 输出:[]
示例 3:
输入:head = [1] 输出:[1]
提示:
- 链表中节点的数目在范围
[0, 100]内 0 <= Node.val <= 100
关键词:双指针,链表的连续性
思路:基本思路是维护两个指针front和rear,分别指向要交换的节点。交换完成后,两个指针进行移位,指向下一对待交换的节点。当链表长度为0(head == NULL)或1(head->next == NULL)时特殊处理,直接返回head;当长度大于等于2时,初始令front = head,rear = head->next。交换完毕后,front所指向的节点在后,rear所指的节点在前。此时若front->next==NULL,说明已经到达表尾,结束;否则令front=front->next,然后再判断front->next是否为NULL,若是则结束(长度为奇数的情况),否则再令rear=front->next,实现移位,继续交换。
需要注意的是,交换操作必须保持链表的连续性,通常可能会忽视rear所指的节点和前面节点(即原本front节点的前一个节点)的连接。可以在移位前使用一个临时指针tmp指向front,然后在交换之后将rear赋给tmp->next。
题解如下:
/**
* 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* front = head;
struct ListNode* rear = head->next;
front->next = rear->next;
rear->next = front;
struct ListNode* dummy = rear;
while(front->next) {
struct ListNode* tmp = front;
front = front->next;
if(front->next == NULL) break;
rear = front->next;
front->next = rear->next;
rear->next = front;
tmp->next = rear;
}
return dummy;
}
&spm=1001.2101.3001.5002&articleId=145776111&d=1&t=3&u=549573ab40914fa5bc40a468d0d7ebd0)
744

被折叠的 条评论
为什么被折叠?



