两两交换链表中的节点C语言
时间: 2023-12-24 20:44:18 浏览: 66
以下是一种实现方式:
```c
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* swapPairs(struct ListNode* head) {
struct ListNode *prev = NULL, *curr = head, *next = NULL;
while (curr != NULL && curr->next != NULL) {
next = curr->next;
curr->next = next->next;
next->next = curr;
if (prev == NULL) {
head = next;
} else {
prev->next = next;
}
prev = curr;
curr = curr->next;
}
return head;
}
int main() {
struct ListNode *head = (struct ListNode*)malloc(sizeof(struct ListNode));
head->val = 1;
head->next = (struct ListNode*)malloc(sizeof(struct ListNode));
head->next->val = 2;
head->next->next = (struct ListNode*)malloc(sizeof(struct ListNode));
head->next->next->val = 3;
head->next->next->next = (struct ListNode*)malloc(sizeof(struct ListNode));
head->next->next->next->val = 4;
head->next->next->next->next = NULL;
printf("Before swapping: ");
struct ListNode *curr = head;
while (curr != NULL) {
printf("%d ", curr->val);
curr = curr->next;
}
printf("\n");
head = swapPairs(head);
printf("After swapping: ");
curr = head;
while (curr != NULL) {
printf("%d ", curr->val);
curr = curr->next;
}
printf("\n");
return 0;
}
```
这个程序使用了三个指针 `prev`,`curr` 和 `next` 来交换相邻的两个节点。在每个循环迭代中,我们先保存当前节点的下一个节点 `next`,然后将当前节点的 `next` 指向 `next` 的下一个节点,再将 `next` 的 `next` 指向当前节点。最后,我们需要将前一个节点 `prev` 的 `next` 指向 `next`,这样交换后的链表就连起来了。注意,还需要特别处理一下头指针。