用C语言满足下列要求:给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
时间: 2024-11-05 17:28:06 浏览: 4
在C语言中,要实现这个功能,我们可以使用迭代的方式来解决。首先,我们需要创建一个结构体来表示链表节点,然后定义一个辅助函数来进行节点的交换。由于题目限制我们不能修改节点内部值,我们将只对指针进行操作。
这是一个简单的示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 链表节点结构体
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
// 辅助函数,用于交换两个节点
ListNode* swapNodes(ListNode* node) {
if (node == NULL || node->next == NULL) {
return node;
}
ListNode temp = *node;
ListNode* nextTemp = temp.next;
temp.next = nextTemp->next;
nextTemp->next = temp;
return nextTemp;
}
// 主函数:给定链表,两两交换相邻节点
ListNode* twoWaySwap(ListNode* head) {
ListNode* current = head;
while (current != NULL && current->next != NULL) {
current->next = swapNodes(current->next);
current = current->next->next;
}
return head;
}
// 创建链表并测试上述函数
void createLinkedList(ListNode** head, int arr[], int size) {
ListNode* node = (*head) = malloc(sizeof(ListNode));
node->val = arr[0];
node->next = NULL;
for (int i = 1; i < size; ++i) {
node = realloc(node, sizeof(ListNode) + sizeof(int));
node->next = malloc(sizeof(ListNode));
node->next->val = arr[i];
node->next->next = NULL;
node = node->next;
}
}
int main() {
int arr[] = {1, 2, 3, 4};
int n = sizeof(arr) / sizeof(arr[0]);
ListNode* head = NULL;
createLinkedList(&head, arr, n);
// 打印原始链表
printf("Original list: ");
printList(head);
// 交换节点后
head = twoWaySwap(head);
printf("\nAfter swapping: ");
printList(head);
return 0;
}
// 辅助函数:打印链表
void printList(ListNode* node) {
while (node != NULL) {
printf("%d -> ", node->val);
node = node->next;
}
printf("NULL\n");
}
```
在这个程序中,`twoWaySwap`函数通过遍历链表,每次交换当前节点和下一个节点,直到链表结束。`createLinkedList`函数用于构建初始链表。注意,这里没有涉及到真正的数据交换,只是改变了节点之间的引用,实现了题目要求。
阅读全文