用c语言实现给定一个单链表,两两交换其中相邻的节点,并返回交换后的链表。注:此题中的单链表是不带头节点的单链表
时间: 2024-05-01 10:19:45 浏览: 224
C语言实现单向链表的创建、插入,删除节点,和2个链表合并
5星 · 资源好评率100%
以下是使用 C 语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* swapPairs(struct ListNode* head) {
if (head == NULL || head->next == NULL) {
return head;
}
struct ListNode* new_head = head->next;
struct ListNode* prev = NULL, *curr = head;
while (curr != NULL && curr->next != NULL) {
struct ListNode* next = curr->next;
curr->next = next->next;
next->next = curr;
if (prev != NULL) {
prev->next = next;
}
prev = curr;
curr = curr->next;
}
return new_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;
struct ListNode* new_head = swapPairs(head);
while (new_head != NULL) {
printf("%d ", new_head->val);
new_head = new_head->next;
}
printf("\n");
return 0;
}
```
在函数 `swapPairs()` 中,我们首先判断链表是否为空或者只有一个节点,如果是,则直接返回原链表。接着定义一个新的头节点 `new_head`,用来保存交换后的链表的头节点。然后定义两个指针 `prev` 和 `curr`,分别表示当前节点的前一个节点和当前节点。在循环中,我们每次取出两个相邻的节点,将它们交换,并将 `prev` 指向交换后的后一个节点,`curr` 指向交换后的后一个节点的下一个节点。最后将 `new_head` 返回即可。
在 `main()` 函数中,我们构造了一个单链表,然后调用 `swapPairs()` 函数进行相邻节点的交换,并输出交换后的链表。
阅读全文